Cristalab

                 ¿Quieres registrarte?

Efecto de nubes con la clase BitmapData Flash 8

Por: Teseo
16 de Enero del 2007
1401 de clabLevel
Otros artículos de Teseo
42,290 visitas

Este pequeño código no necesita ninguna imagen para trabajar. Crea un MovieClip que llamaremos nubes, le asocia un BitMap y genera las formas y el movimiento.
Además de los movimientos de desplazamiento en ambos ejes, modifica sutilmente la forma de las nubes (evolución) dotando al efecto de mayor realismo. Le he añadido al ejemplo una casita por delante para darle una referencia y un poco de vistosidad.

Así se vería el efecto. Las nubes son 100% generadas por Actionscript.



Para insertarlo en nuestra película, sólo debemos colocar el siguiente código en el primer keyframe (Explicación después del código)

Código :

createEmptyMovieClip("nubes", 0);
img = new flash.display.BitmapData(400, 200);
img2 = img.clone();
temp = img.clone();
nubes.attachBitmap(img, 0);
nubes._xscale = 250;
nubes._yscale = 150;
pt = new flash.geom.Point();
dMap = new flash.filters.DisplacementMapFilter(img, null, 8, 8, 0, 0, "warp");
onEnterFrame = function () {
   pt.x += .5;
   dMap.scaleX -= .8;
   dMap.scaleY -= -.4;
   img.perlinNoise(60, 50, 5, 9, true, true, 7, true, [pt]);
   img.merge(img2, img.rectangle, null, 20, 23, 215);
   temp.copyPixels(img, img.rectangle, null);
   img.applyFilter(temp, img.rectangle, null, dMap);
};
Las variables principales para cambiar son:

dMap.scaleX -= .8; dMap.scaleY -= -.4;
La fuerza del "viento" en ambos ejes. Esta variables también dependen del ajuste de las escalas.

pt.x += 5;
Es el offset del perlinNoise para la primera octava, se pueden añadir mas puntos a la matriz para cada octava, pero uno es suficiente. Tiene un valor algo crítico pues si se "desincroniza" con el desplazamiento puede aparecer un "corte" en el movimiento. Entre .1 y .7 no dará problemas a escalas normales. También se puede eliminar la instrucción si dá problemas sin mayores consecuencias y colocando un null en su parámetro del perlinNoise. Su trabajo es el movimiento interno de las nubes (evolución) fuera del desplazamiento.

img.perlinNoise(60,50,5,9, true,true,7,true,[pt]);
Son los valores de alargamiento de las "nubes", junto con el cambio de escala del moviclip dan la forma. El valor 5 es el número de octavas, Menos valor, mas difuminado. El valor 9 puede ser cualquiera ya que es la semilla aleatoria.

img.merge(img2,img.rectangle,null,20,23,215);
Los valores RGB del cielo, he omitido el alpha por que es por donde trabaja el "warp" del desplazamiento y mejor no tocarlo.

El tamaño del bitMap y la escala de las nubes se ajustan según la necesidad de aplicación. Se pueden añadir mas efectos de color y sombras duplicando el merge con otros valores o también con transformaciones de color.


Artículos Relacionados


Etiquetas actionscript

Comentarios | Enviar un comentario
Es estupendo, realmente genial pra usarlo como fondo en animaciones o header de web cools. Gracias de nuevo. :)
Por: Sisco
Uhh teseo , porque pasa esto de la imagen???


Se ve como una línea de corte!!

Por lo demas, excelente trabajo!! ^^
Por: ramiro_olver@
Ya lo expliqué en el post.
Si movemos a cierta velocidad y no está "cuadrada" la relación entre escala del perlin, dicha velocidad de movimiento y el offset habría corte. Se produce porque al "fundido" del temp no le dá tiempo suficiente a difuminarlo al cabo de varios ciclos se "armonizan" de repente.
Se pueden eliminar del código perfectamente estas lineas:
pt = new flash.geom.Point();
pt.x += .5;

Y el perlin dejarlo así:
img.perlinNoise(60, 50, 5, 9, true, true, 7, true, null);
De ese modo seguirá habiendo evolución, pero menor, y no aparecerán nunca esos "empalmes".
La verdad, debí de postearlo sin ellas. Las proporciones que evitan que eso salga tienen un cálculo algo complejo. Mejoraré el código para incluir su dependencia y más colorido. Esto era un ejemplo simple, aunque funcional, para explicar el método.
Por: Teseo
Hay que advertir que el efecto es increíblemente pesado del lado del procesador. Es posible optimizarlo con los lineamientos que da Teseo en el tip y hay que pensar en que casos se usará antes de implementarlo.
Por: Freddie

F :

Hay que advertir que el efecto es increíblemente pesado del lado del procesador. Es posible optimizarlo con los lineamientos que da Teseo en el tip y hay que pensar en que casos se usará antes de implementarlo.


es lo primero que pensé
Por: Johnny
El peso sobre el procesador es producido principalmente por las 5 octavas que le clavamos al perlinNoise. Según las necesidades de aplicación, podemos simplemente dejar solo trabajando en frames al desplazamiento de mapa siendo de este modo muchísimo más ligero. Eso nos hace renunciar a la "evolución" de las nubes quedando como un scroll continuo en ambas direcciones (también se puede usar el desplazamiento del mapa para eso simplemente: scroll continuo en cualquier dirección de una imagen).
El código entonces quedaría así:

Código :

nubes.attachBitmap(img, 0);
nubes._xscale = 250;
nubes._yscale = 150;
dMap = new flash.filters.DisplacementMapFilter(temp,null,8,8,0,0,"warp");
img.perlinNoise(60, 50, 5, 9, true, true, 7, true, null);
img.merge(img2, img.rectangle, null, 20, 23, 215);
temp.copyPixels(img, img.rectangle, null);
onEnterFrame = function () {
   dMap.scaleX -= .8;
   dMap.scaleY -= -.4;
   img.applyFilter(temp, img.rectangle, null, dMap);
}

O buscar una solución intermedia llamando al perlinNoise cada cierto tiempo ( cada 100 frames por ejemplo) si no queremos renunciar totalmente al efecto de evolución.
O hacer capas de desplazamiento para simular la evolución.
etc...
Por: Teseo
hola soy nuevo en el foro y tratado de hacer uno que otro ejercicio de los que tienen aqui y todos me parecen muy buenos . gracias por toda esta informacion ya que yo soy principiante en esto de flash y todo esto me ha ayudado muchisimo ya que lo estoy aprendiendo por mi cuenta.
Por: roberto_blog
Teseo muy buen efecto, una pregunta, como hago para cambiarle el fondo azul del cielo por otro fondo, por ejemplo una imagen cualkiera? Gracias
Por: Sneik_blog
disculpen pero a mi no se me ve donde estan las imagenes?
Por: brian_blog
disculpen es que no me di cuenta de el efecto es solo para flash 8
Por: brian_blog
Lo que pasa es que en vez de "warp" debería poner "wrap":

dMap = new flash.filters.DisplacementMapFilter(temp,null,8,8,0,0,"wrap");

No se si eso influirá... voy a probarlo :)
Por: Gerard_blog
Un ejemplo en formato .fla, resultaría muy util, para saber como utilizar estos codigos.
Si es posible enviar el ejemplo, mi correo es kicedo@hotmail.com.

Gracias

Nota: Soy nuevo en flash
Por: CARLOS CAICEDO_blog
Es efectivo el alto consumo de CPU, ahora tengo uso de casi un 90% (bajo WinXP) y al momento de cerrar la venta vuelve a un 10% a lo mas... sobre un opteron y 2 GB RAM.

Saludos.-
Por: Jaime_blog
Hola, me pasa lo mismo que a Brian, no puedo ver las imágenes que he insertado, y sería muy bueno enviar un ejemplo en formato .fla
Si es posible enviar el ejemplo a tovelay@yahoo.es

Muchas gracias por todo
Por: roberto_blog
necesito saber como hago para que las imagenes no me queden en la parte de atras, Ya que las nubes me quedan al frente.
gracias por esos trucos tan excelentes viejo
Por: johan D:::::::::_blog
Un saludo alguien sabe como hago para cambiar el fondo, si lo quiero en otro color o otra fotografia?
Por: Fabian Manzano_blog
Para que el efecto de las nubes quede de fondo y las imagenes al frente prueben poniendo el codigo dentro de un Movie Clip y luego lo hubican en un layer por debajo de las imagenes y listo!

Es cierto este efecto pone el procesador al 100% haber que se puede hacer para optimizar esto, peor la verdad es un efecto buenisimo felicidades Teseo!
Por: Isma_blog
Pues casi tengo preparado un código que hace lo mismo.......crea nubes de muchas más formas, colores y tipos, incluida niebla y humos.............pero sin excesivo consumo de CPU ( el 10% del anterior) Estoy algo liado ahora y quiero afinarlo del todo.
El ejemplo anterior era solo un ejemplo para mostrar la asociación Perlin-Desplazamiento.
Muy pronto lo subiré como añadido aquí mismo.
Por: Teseo
como hago para poner una imagen encima de las nubes, asi como esta la casita?
Por: saludos._blog
Hola soy principiante y los ejemplos estan buenasos felicitaciones sigan ayudando a quienes gustan aprender.
Por: Lenin Del Castillo Chasqu
Es posible que el ejemplo me lo envies arichardvergara3@hotmail.com Gracias
Por: riveña_blog
corrijo el correo es richardvergara3@hotmail.com para que me envies el archivo del ejemplo.
Gracias
Por: riveña_blog
muy bueno este ejemplo, perdona podrías mandarmelo también a mi correo rubenfdez@gmail.com gracias
Por: ruben_blog
en este caso de las nubes, si el efecto es corto que hay que hacer si la animacion es mas grande del efecto de la nube digamelo ahorita si leen este comentario
Por: carlos martinez_blog
Teseo, cuando vas a subir tu nuevo ejemplo. A por cierto, esta super tu ejemplo.
Por: benjamin_blog
Obviamente el efecto con la clase bitmap es muy bueno, excepto por el consumo de recursos, pero ya que viene al tema, aqui algo que encotre http://www.oman3d.com/tutorials/flash/learnflash_clouds
8)
Por: asael2_blog
disculpa me dise ke ahi un error en
onEnterFrame = function () {
Por: aprendis_blog
kilroy te lo agradece
Por: MaBoRaK
Muy bueno este efecto es genial,Teseo felicitaciones
Mil gracias :wink:
Por: Malu11
muy buen efecto que increible
Por: elvis-blog
pos me podrian explicar como hacer esto ademas de insertar ese cogigo
Por: Raesen-blog
Flash 8. 1er frame, pestaña de acciones, pegar el código, ctrl+Enter y ya.
Por: Teseo
hola amigos de flash me agrada comunicarme con ustedes, les cuento que resien estoy aprendiendo flash y me gustaria que me manden un tutorial para hacer el efecto de nube,....les agradeceria si me lo mandan a mi correo q es educoold_4@hotmail.com y algunos tutoriales q pueda ser util agradeciendolos de antemano gracias por todo..............
Por: educoold-blog
Gracias, es mejor que con img. Exactamente lo que necesitabamos... Habra que ver si se puede hacer de noche... jajaja:... hueee
Por: yodepapel
como logro que se valla al fondo y poner mas imagenes encima. que clase de img se pueden sobreponer? gracias
Por: juan mu;oz-blog
como puedo recortar el marco de las imagenes?
es que cuando importo una imagen con forma redonda me sale un marco y me tapa lo que ai detras, esque no ai alguna barita magica como en el photoshop para borrar lo que no interesa??????????????
Por: Friki FlashMan-blog
responder por favor..............
Por: Friki FlashMan-blog
hola, estoy teniendo inconvenientes con este efecto, yo coloco el código, pero no aparece al probarlo con alt+enter, será que hay algún parámetro que me haya saltado?
Por: Snurffo-blog
no puedo ver el efecto en esta pagina ni en flash :S xq??
Por: duda-blog
Yo tambien copio el codigo y no pasa nada y me sale un listado de errores en la compilacion. tengo el flash 9.0
Por: Jano-blog
1120: Access of undefined property img.

me salen varios errores de ese tipo en la compilacion...ayudenme PLS
Por: Jano-blog
Hola es posible personalizar el tamaño de la imagen ya que mi vaner tiene 600 x 100 pixeles, gracias
Por: Alejandra-blog
el cielo me tapa mi ciclista, ¿como me lo hago para que el ciclista se pueda ver?
gracias
Por: ramon-blog
Deja un comentario
IMPORTANTE

Recuerda ser respetuoso, no insultes a otras personas, ni uses palabrotas, hay una persona al otro lado de la pantalla.

Habla bien, NO ESCRIBAS EN MAYUSCULA TODO, no escribas como en un SMS, evita cosas como "ke", "x q" y demás abreviaciones.

Aquí funcionan las etiquetas de los foros, puedes usar [b] para negrita, [img] para las imágenes, [url] para los enlaces, etc.

Si tienes preguntas técnicas, envíalas mejor al foro.