En este tip les mostraré cómo simular llamas y fuego con Flash 8 y la clase BitmapData. Cómo en otros ejemplos de esta serie de efectos, basta con emplear adecuadamente la mezcla de perlinNoise y el Desplazamiento de Mapa de bits y sus parámetros para conseguirlo:
Este es un código muy simple para iniciarse:
Solo hay que vincular una imagen con nombre "imagen" desde la biblioteca.
Código :
import flash.display.BitmapData;
import flash.geom.*;
import flash.filters.*;
img = BitmapData.loadBitmap("imagen");
createEmptyMovieClip("efecto", 0);
efecto.attachBitmap(img, 0);
efecto._yscale = 190;
efecto._xscale = 160;
olas = ola = new BitmapData(efecto._width, efecto._height);
offset = new Point(0, 0);
desMap = new DisplacementMapFilter(olas, new Point(50, 40), 1, 1, 100, -100, "warp");
onEnterFrame = function ()
{
offset.y += 10;
//offset.x -= 9.8;
ola.perlinNoise(6, 18, 2, 0, true, true, 1, true, [offset]);
efecto.filters = [desMap];
};Usando una imagen que es "medio sol" no genera este resultado:
Veamos ahora como "mejorar" el código para aumentar el realismo.
Añadimos filtros de Blur y Transformación de color combinados a un MovieClip cualquiera e con el nombre de instancia MCtexto. Como siempre hay que ajustar los parámetros al gusto o necesidad.
Este es el código:
Código :
import flash.filters.*;
import flash.geom.*;
import flash.display.*;
w = MCtexto._width + 20;
h = MCtexto._height + 150;
ori = new BitmapData(w, h, true, 0xffaa6600);
createEmptyMovieClip("marco", 1);
sal = new BitmapData(w, h, true, 0xff000000);
capt = sal.clone();
dif = sal.clone();
marco.attachBitmap(sal, 0);
Mx = new Matrix();
Pt = new Point();
R0 = sal.rectangle;
B1 = new BlurFilter(2, 4, 2);
CM1 = new ColorMatrixFilter([.33, .33, .33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, .5, 0, 0, 0, 0, 1, 0]);
CM2 = new ColorMatrixFilter([.72, .5, 0, 0, 0, .02, .65, 0, 0, 0, 0, 0, .25, 0, 0, 0, 0, 0, 1, 0]);
DM1 = new DisplacementMapFilter(dif, Pt, 1, 2, -6, -36);
MCtexto._visible = false;
setInterval(flamatexto, 40);
function flamatexto()
{
dif.draw(capt);
capt.draw(MCtexto);
dif.applyFilter(dif, R0, Pt, CM1);
dif.threshold(dif, R0, Pt, ">", 0xff330000, 0xff808080, 0x00ffffff);
dif.applyFilter(dif, R0, Pt, B1);
sal.draw(dif, Mx, null, 8);
dif.perlinNoise(9, 18, 3, random(255), false, true, 7, false);
dif.draw(ori, Mx, null, 6);
sal.applyFilter(sal, R0, Pt, DM1);
sal.applyFilter(sal, R0, Pt, CM2);
}Añado un botón para bajar el FLA para que lo podáis trastear mejor:
El "encendido" que le he puesto al ejemplo se puede modificar o anular cambiando este parámetro:
- dif.threshold(dif, R0, Pt, ">", 0xff330000, 0xff808080, 0x00ffffff);
Por ejemplo podemos poner valores mayores o menores en el rojo. 0xff120000 ó 0xff440000.
Depende también de la transparencia y color del relleno del MCtexto (instancia) usado.
La "agitación" de la llama está controlada por el Perlin Noise y la "intensidad" y dirección por el Desplazamiento de mapa de bits. El color evidentemente pertenece a los valores de la matriz de ColorTransform.
Veamos ahora un ejemplo de llama simple.
Este efecto simula una llama de vela. No necesita ninguna imagen. Simplemente copiar y pegar. Crea un gradiente y se le aplican los filtros y métodos. Como siempre variando los parámetros conseguimos cambios de color, forma, velocidad..etc.
Código :
createEmptyMovieClip("llama", 0);
colores = [0xffffffff, 0xfff2f215, 0xffff9900, 0xff00000f];
alphas = [40, 90, 85, 40];
ratios = [20, 90, 175, 235];
Pt = new flash.geom.Point();
Mx = new flash.geom.Matrix();
Mx.createGradientBox(30, 90, Math.PI / 2, 0, 10);
with (llama) {
beginGradientFill("radial", colores, alphas, ratios, Mx, "pad", "RGB", .98);
moveTo(0, 0);
lineTo(0, 100);
lineTo(40, 100);
lineTo(40, 0);
lineTo(0, 0);
endFill();
}
ola = new flash.display.BitmapData(llama._width, llama._height + 30);
dM = new flash.filters.DisplacementMapFilter(ola, null, 1, 1, 3, 3, "ignore");
onEnterFrame = function ()
{
Pt.y += 3.3;
Pt.x -= .3;
a = random(7) * (random(10) < 1);
llama._yscale = 120 + a;
llama._y = -a;
ola.perlinNoise(24, 32, 1, 0, true, true, 1, false, [Pt]);
llama.filters = [dM];
};0,5 Kb
Prosigamos, ahora vamos a dar movimiento un "objeto ardiente":
Añadimos ahora algunas cosillas más (que ya había ido colocando poco a poco en otros efectos de esta serie) sobre filtros y Blendmode.
Como casi siempre en los ejemplos anteriores y por seguir ese estilo, vincularemos una imagen desde la biblioteca con nombre "imagen" y pondremos simplemente el código en el primer fotograma del raiz.
Podemos clicar en la imagen para cambiar los Blendmode.
4.7Kb
Código :
import flash.filters.*;
import flash.geom.*;
import flash.display.*;
velox = veloy = 8;
img = BitmapData.loadBitmap("imagen");
ori = new BitmapData(400, 300, false, 0xff8000);
createEmptyMovieClip("marco", 1);
createEmptyMovieClip("marco2", 2);
img2 = marco2.createEmptyMovieClip("copia", 0);
img2.attachBitmap(img, 5);
marco2.blendMode = 7;
marco.blendMode = 7;
sal = new BitmapData(400, 300, false, 0);
capt = sal.clone();
dif = sal.clone();
sal.draw(img);
marco.attachBitmap(sal, 0);
Mx = new Matrix();
Pt = new Point();
R0 = new Rectangle(0, 0, 400, 300);
B1 = new BlurFilter(6, 6, 2);
CM1 = new ColorMatrixFilter([.3, .3, .3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0]);
CM2 = new ColorMatrixFilter([.7, .5, 0, 0, 0, 0, .7, 0, 0, 0, 0, 0, .5, 0, 0, 0, 0, 1, 0]);
DM1 = new DisplacementMapFilter(dif, Pt, 1, 2, 6, -24, "clamp");
setInterval(flama, 20);
function flama()
{
dif.draw(capt);
capt.draw(marco2);
dif.draw(capt, Mx, null, 7);
dif.applyFilter(dif, R0, Pt, CM1);
dif.threshold(dif, R0, Pt, ">", 0x330000, 0xffaaaaaa, 0xff0000);
dif.applyFilter(dif, R0, Pt, B1);
sal.draw(dif, Mx, null, 8);
dif.perlinNoise(10, 10, 2, random(255), false, true, 7, false);
dif.draw(ori, Mx, null, 6);
sal.applyFilter(sal, R0, Pt, DM1);
sal.applyFilter(sal, R0, Pt, CM2);
img2._x += velox;
img2._y += veloy;
img2._x > 300 || img2._x < 0 ? velox = -velox : null;
img2._y > 200 || img2._y < 0 ? veloy = -veloy : null;
}Al clicar en la imagen cambia el valor de marco2.blendMode entre 0 y 14. Cómo siempre es bueno experimentar con los valores del PerlinNoise y del Desplazamiento de mapa. Con ello conseguiremos mas fuerza, viveza, velocidad, forma , etc...
El cambio en los colores de los filtros de color evidentemente coloreará de otro modo la "estela".
En este ejemplo es importante el fondo donde se efectúa (por el Blend) de modo que distintos fondos también crean distintos efectos.
Le he puesto en la función un simple movimiento de rebote para presentar el efecto (puede ser cualquiera).
También manejando algunas "cargas" del filtro podemos hacer el efecto de quemar un papel o mapa , cortar a laser, etc, etc... Ya los iré posteando.
La imagen puede ser un logo, texto, o forma cambiante.......
Veamos ahora una pequeña variación de este código fusionado junto a otro antiguo código que posteé sobre detección por cam y tendremos la ya muy conocida fuegocam:
Aquí lo que tenemos que poner en la biblioteca es el icono de la cam. Arrastramos la misma al escenario y la colocamos en la esquina superior izquierda. A esa instancia la llamamos cam y ponemos el código en el primer frame del raiz.
Código :
import flash.filters.*;
import flash.geom.*;
import flash.display.*;
cam.attachVideo(Camera.get());
createEmptyMovieClip("marco", 1);
marco.blendMode = 8;
marco._xscale = marco._yscale = cam._xscale = cam._yscale = 250;
w = cam._width;
h = cam._height;
sal = new BitmapData(w, h, false, 0);
capt = sal.clone();
dif = sal.clone();
marco.attachBitmap(sal, 0);
ori = new BitmapData(w, h, false, 0xff8000);
Mx = new Matrix();
Pt = new Point();
R0 = new Rectangle(0, 0, w, h);
B1 = new BlurFilter(6, 6, 1);
CM1 = new ColorMatrixFilter([.3, .3, .3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0]);
CM2 = new ColorMatrixFilter([.7, .5, 0, 0, 0, 0, .7, 0, 0, 0, 0, 0, .5, 0, 0, 0, 0, 1, 0]);
DM1 = new DisplacementMapFilter(dif, Pt, 1, 2, 6, -24);
setInterval(flamacam, 30);
function flamacam()
{
dif.draw(capt);
capt.draw(cam);
dif.draw(capt, Mx, null, 7);
dif.applyFilter(dif, R0, Pt, CM1);
dif.threshold(dif, R0, Pt, ">", 0x330000, 0xffaaaaaa, 0xff0000);
dif.applyFilter(dif, R0, Pt, B1);
sal.draw(dif, Mx, null, 8);
dif.perlinNoise(10, 10, 2, random(255), false, true, 7, false);
dif.draw(ori, Mx, null, 6);
sal.applyFilter(sal, R0, Pt, DM1);
sal.applyFilter(sal, R0, Pt, CM2);
}Este es el resultado:
0,7Kb
Cómo siempre se puede jugar algo con los parámetros para afinarlo a nuestras propias necesidades o estilo.

Por Sebastian Garcia el 01 de Junio de 2007
Por FeNtO el 01 de Junio de 2007
Por guille77 el 01 de Junio de 2007
Por cierto muy bueno el efecto
Por Lunatic el 01 de Junio de 2007
Sin embargo... no consume muchos recursos? Al poner play a dos películas simultaneas me ralentiza firefox.
Por Nito el 01 de Junio de 2007
Por fitoartes el 02 de Junio de 2007
Aviso:
El ejemplo de la CAM ( el último) solo es activo y visible si tienen una webcam conectada y activa.
En cuanto al consumo de CPU es cierto, consumen mucho y cuando mayor es el tamaño, peor. Estos efectos son para usarlos con moderación y cuidando de ajustar su llamada en setInterval a la frecuencia menor posible.
Actualmente tengo bastantes efectos pasados a AS3 y estoy montando en Apollo una aplicación completa con ellos y otras muchas cosas, (por cierto, ahí vuelan sin problemas). Incluyo todo el motor 3D (a nivel de bit) que desarrollé, skins, transiciones, etc...
Como lo hago a ratos de entretenimiento, no creo que lo termine hasta después de navidades, pero postearé algunos "trozos" (útiles en si mismos) en AS2 y AS3 por aquí, para ver con los comentarios como mejorarlos y detectar con su ayuda los bugs que seguro he cometido.
Se acepta cualquier ayuda..... (gratis por supuesto, ya que la aplicación también lo será)
Esta genial! EL mejor es el de la webcam.
Por paberu el 04 de Junio de 2007
Por Eguy el 05 de Junio de 2007
Por guille77 el 06 de Junio de 2007
Acepto respuestas de cualquiera.
P.D.: uso Flash 8.
Sobre la ventana de la biblioteca, ratón derecho: Nuevo video. ( En la ventana que se abre: controlado por ActionScript y como nombre el que quieras).
Desde la biblioteca arrastras su icono al escenario. Le pones en sus propiedades en nombre de instancia : cam.
Eguy:
Si, el "tratamiento de humos" lo pondré enseguida.
Por Roberto C el 08 de Junio de 2007
Por Señor Oz el 13 de Junio de 2007
¿No?
Por Izzio el 02 de Septiembre de 2007
Por jeli el 19 de Septiembre de 2007
Por mithon el 25 de Enero de 2008
no lo he visto aun, tengo un hp tx1000 con la webcam integrada y no puedo ver nada, existe la version para el flash 8?
gracias!
Por LauraDark el 29 de Enero de 2008
Cómo le hago para que se cargue a una parte específica del escenario, ya que no sé en qué parte del código le puedo modificar esto.
Gracias y de nuevo felicitaciones!!!!!!
Por viktor el 29 de Febrero de 2008
Por ola el 25 de Abril de 2008
Por david el 05 de Mayo de 2008
Por Marianita el 11 de Mayo de 2008
Por Irius el 06 de Junio de 2008
aparte me sale siempre en la esquina superior izquierda, alguna solucion para ambos problemas?
Teseo gracias por este aporte
Por Sergio el 13 de Junio de 2008
como puedo cambiar la posicion del efecto
es decir hice est eefecto en un archivo independiente y lo quise colocar en otra animacion, solo que me la coloca en la parte superior izquierda.
y quisiera saber como puedo. modificar esta posicion y al igual que los demas como poner el fondo transparente, por que aunue este en la primera casa cuando se prueba el swf, me lo coloca hasta el frente
espero me puedas ayudar
saludo!!!
Por xio el 05 de Agosto de 2008
Por Sirio el 06 de Septiembre de 2008
Puedes bajar el FLA y simplemente cambiar el MC que usa por el tuyo y darle tus ajustes y retoques personales.
Y............... Yo mismo te puedo asegurar que funciona.
Por Sirio[url]=http://ww el 21 de Septiembre de 2008
Por Antonio el 19 de Noviembre de 2008
Por .:.:.xEbAx.:.:. el 21 de Noviembre de 2008
Esas llamas son muy realista y rebrutales...pero kisiera sabr como hago para meterlas en otro archivo pero q me elimine ese fondo negro.
les agradeceria en el alma una respuesta....Too bn...!!!
Por Hugaless el 05 de Diciembre de 2008
Para ponerlo donde quiero en el escenario
Gracias
Por Azcorra el 02 de Enero de 2009
coordenadas a este efecto, ya que al ejecutar esta animación, me la carga en la esquina superior izquierda.
Por Eagles el 12 de Mayo de 2009
Metanlo en otro MC y listo...
Saludos
Por tiza el 20 de Mayo de 2009
Por herrera_df el 28 de Mayo de 2009
Por Nuse el 01 de Julio de 2009
Por Ceto el 21 de Julio de 2009
Saludos.
Por tatanes el 16 de Agosto de 2009
Por daniela el 29 de Agosto de 2009
Por abcdef el 09 de Septiembre de 2009
Por akatsuki el 05 de Octubre de 2009
Por akatsuki el 05 de Octubre de 2009
Por Gustavo el 30 de Enero de 2010
Por Desperate Man el 18 de Marzo de 2010
Por german el 12 de Abril de 2010
me gustaria hacer el efecto del cometa pero en fondo blanco y al cambiar el fondo la llama me cambia de color a celeste ¿que parametro devo cambiar?
Por axel_BB el 15 de Julio de 2010
Por Fac el 27 de Julio de 2010
CM1=new ColorMatrixFilter([.33,.33,.33,0,0, 0,0,0,0,0, [b]0,0,0,.5,0,[b/] 0,0,0,1,0]);
Por:
CM1=new ColorMatrixFilter([.33,.33,.33,0,0, 0,0,0,0,0, 0,0,0,.0,0, 0,0,0,1,0]);
Por Fac el 27 de Julio de 2010
Para poner el fondo negro yo hice esto, cambié:
CM1=new ColorMatrixFilter([.33,.33,.33,0,0, 0,0,0,0,0, 0,0,0,.5,0, 0,0,0,1,0]);
Por:
CM1=new ColorMatrixFilter([.33,.33,.33,0,0, 0,0,0,0,0, 0,0,0,.0,0, 0,0,0,1,0]);
Por Leproso el 23 de Octubre de 2010
Por Fernando el 14 de Noviembre de 2010
Por mauricio el 18 de Noviembre de 2010
Por Sr murillo el 23 de Febrero de 2011
Por luis el 20 de Marzo de 2011
Preguntarte como puedo poner FONDO TRANSPARENTE a estos archivos. Para que en la pagina se vea bien el fondo de la pagina, y que no me salga una caja, se trata de insertar este swf, dentro de otro, no colocarlo directamente en la web. Gracias
Por Lina el 14 de Junio de 2011
Por algo el 22 de Febrero de 2012