Cristalab

                 ¿Quieres registrarte?

Efectos lago, rio y cascada con BitmapData de Flash 8

Por: Teseo
7 de Febrero del 2007
1401 de clabLevel
Otros artículos de Teseo
50,749 visitas

Estos efectos simulan el reflejo de una imagen sobre el agua. De ese modo, puedes crear cualquier imagen y se generarán las ilusiones del reflejo de un lago, del paso de un río o el estar detrás de una cascada. Está basado en la combinación de PerlinNoise con el desplazamiento de mapa de bits. De este modo podemos simular desde un tranquilo lago, hasta aguas torrenciales y cascadas.
En este ejemplo necesitamos solamente la imagen a reflejar vinculada en la biblioteca con el nombre "imagen".

En su forma simple dicho reflejo es uniforme y no presenta profundidad en la distancia. Para dotarle de relieve, hacemos una división de la imagen en tres partes de 1/6, 2/6(1/3) y 3/6(1/2) y aplicamos los desplazamientos y filtros independientemente.
Veamos estos tres ejemplos y la explicación de sus parámetros más significativos.

Efecto lago:



Código :

import flash.display.*;
import flash.geom.*;
import flash.filters.*;
img = BitmapData.loadBitmap("imagen");
w = img.width;
h = img.height;
attachBitmap(img, 1);
createEmptyMovieClip("sal", 0);
sal.attachBitmap(img, 1);
sal._y = 2*img.height;
sal._yscale = -100;
pt1 = new Point();
pt2 = new Point();
pt3 = new Point();
Mx = new Matrix();
ola1 = new BitmapData(w, h/6);
ola2 = new BitmapData(w, h/3);
ola3 = new BitmapData(w, h/2);
dM1 = new DisplacementMapFilter(ola1, new Point(0, 0), null, 4, 0, 20, "clamp");
dM2 = new DisplacementMapFilter(ola2, new Point(0, h/6), null, 4, 0, 50, "clamp");
dM3 = new DisplacementMapFilter(ola3, new Point(0, h/2), null, 4, 0, 120, "clamp");
onEnterFrame = function () {
   pt1.y -= .2;
   pt2.y -= .4;
   pt3.y -= .8;
   ola1.perlinNoise(0, 2, 1, 0, true, true, 4, true, [pt1]);
   ola2.perlinNoise(40, 4, 2, 0, true, true, 4, true, [pt2]);
   ola3.perlinNoise(80, 8, 1, 0, true, true, 4, true, [pt3]);
   sal.filters = [dM1, dM2, dM3];
};

Para ajustar a nuestras necesidades el efecto podemos variar los parámetros siguientes:
20, 50 y 120 de dM1, dM2 y dM3 para desplazar la escala Y del reflejo.
Los valores pt .y que dan la velocidad a las olas.
Los 3 primeros valores del perlinNoise para dar la agitación de las olas y el valor tercero de cada Perlin entre 1 y 5 para dotar de mayor "espejo" a cada zona al afinar por más octavas.
También podemos hacer que los tres tipos de ola se "solapen" más entre sí variando su tamaño y el punto de inclusión en el desplazamiento.
Para ondas lineales simplemente pondremos a 0 los primeros valores (x) de cada perlinNoise.

Efecto rio:



En este caso modificamos en cada frame no solo el perlin en Y sino también en X consiguiendo un movimiento lateral que simula un arroyo. Solo utilizamos un desplazamiento aunque podemos hacerlo como en el caso del lago y variar X e Y a tres velocidades para dar más sensación de profundidad si fuera necesario.

Código :

import flash.display.BitmapData;
import flash.geom.*;
import flash.filters.*;
img = BitmapData.loadBitmap("imagen");
attachBitmap(img, 1);
createEmptyMovieClip("sal", 0);
sal.attachBitmap(img, 0);
sal._y = 2*img.height;
sal._yscale = -100;
ola = new BitmapData(img.width, img.height);
pt = new Point();
dM = new DisplacementMapFilter(ola, new Point(), 1, 1, 0, 40, "ignore");
onEnterFrame = function () {
   pt.y -= .3;
   pt.x -= 1.7;
   ola.perlinNoise(20, 4, 1, 0, true, true, 1, true, [pt]);
   sal.filters = [dM];
};


Efecto cascada:



Utilizamos un código similar al usado para el lago con tres niveles pero sin hacer espejo de la imagen y ajustamos los parámetros:

Código :

import flash.display.*;
import flash.geom.*;
import flash.filters.*;
img = BitmapData.loadBitmap("imagen");
w = img.width;
h = img.height;
createEmptyMovieClip("sal", 0);
sal.attachBitmap(img, 1);
pt1 = new Point();
pt2 = new Point();
pt3 = new Point();
ola1 = new BitmapData(w, h/6);
ola2 = new BitmapData(w, 3+h/30);
ola3 = new BitmapData(w, 4*h/5);
dM1 = new DisplacementMapFilter(ola1, new Point(), null, 4, 0, 20, "clamp");
dM2 = new DisplacementMapFilter(ola2, new Point(0, h/6), null, 4, 30, 50, "clamp");
dM3 = new DisplacementMapFilter(ola3, new Point(0, h/5-3), null, 4, 0, 90, "clamp");
onEnterFrame = function () {
   pt1.y -= .4;
   pt2.y -= 2.5;
   pt3.y -= 3;
   ola1.perlinNoise(4, 2, 1, 0, false, true, 4, true, [pt1]);
   ola2.perlinNoise(8, 4, 1, 0, false, true, 4, true, [pt2]);
   ola3.perlinNoise(3, 7, 1, 0, false, true, 4, true, [pt3]);
   sal.filters = [dM3, dM2, dM1];
};

Para ampliaciones, dudas y comentarios sobre estos efectos consultar en este post:
¿Cómo lograr un efecto de agua?

Para más información del uso de estos efectos, puedes ver otros:


Artículos Relacionados


Etiquetas actionscript

Comentarios | Enviar un comentario
Orale!! Muchas gracias, excelente uso del BitmapData!.
Por: Rafeo_blog
:p esta weno!! el efecto.
Por: AaronDark_blog
Excelentes efectos Teseo!!. Te felicito ^^
Por: XKlibur
esto es mejor que subirte un gif a tu swf xD
Por: marcioangel_blog
Excelente ejemplo, te felicito.
Por: jomajudo_blog
Interesante efecto, se me ocurren varias aplicaciones para ello, gracias por el dato ;)
Por: Aoyama
Excelente como siempre.. una pregunta ¿Porque cargas clases innecesarias (cuando usas *)?
No sobrecargaría menos el computador si cargaras las clases justas y necesarias?
Por: RattaMono
En cuanto a la carga de clases........poner * no hace que se cargen las que no necesitas!!
Al compilarse el swf solo coge las que realmente usas. Mira la referencia de Adobe:

Si importa una clase pero no la utiliza en el script, la clase no se exporta como parte del archivo SWF. Eso significa que puede importar grandes paquetes sin preocuparse del tamaño del archivo SWF; el código de bytes asociado con una clase se incluye en un archivo SWF únicamente si dicha clase se utiliza realmente.

Por: Teseo
Gracias! No sabía eso, por eso preguntaba xD
Por: RattaMono
Me encantan!, me encantan!, no sé para que me pueden servir, pero me gustan mucho! :)
Gracias de nuevo Te!
Por: Sisco
Uff que efecto tan vacano, gracias
Por: Rubencho176_blog
la verdad se ven locos los trucos
Por: Eliel_blog
Gracias, acabo de subir una funcioncita de puzzle para un bitMap cualquiera en el otro post

....La tengo que afinar y añadir alguna cosilla de transiciones para ponerla aquí de tip pero me gusta como funciona por ahora. :)
Por: Teseo
AHA, grande TESEO , como siempre, felicidades
ya habia visto este efecto en unos protectores de pantalla y siempre me quedo la duda como hacian ese efecto

Teseo , tienes pagina web cual es la direccion???
Por: eveevans_blog
es muy bueno gracias por la ayuda
Por: gorky_blog
vaya, ahora ya se como simular el efecto se SAP cuando carga.....

Me han encantado los 3 efectos, quizá el de la cascada algo menos, pero supongo que es plan de ajustarla a mi gusto y elegir una foto chula.

be water my friends
Por: chaves_blog
Deslumbrante el efecto. Estoy impresionda. Había visto algo similar en java, pero no en AS. Enhorabuena! Está brutal
Por: Carmen
mega genial, gracias!
Por: scx7_blog
simplemente... magnifico! como todos los otros efectos que has publicado, felicitaciones, estan increibles!
Por: EmiR
QUE VAKAN ESOS EFECTOS GRACIAS
Por: DoMEnIcA!!_blog
y como se mete el codigo en un movie clip en un fotograma , explica men por fa!!!
Por: Mr Chud_blog
Solo pensaria esta clase de cosas de un brujo o hechiceros increible!!!!
Por: FlasherMx_blog
Excelente!!! gracias por el ejemplo
Por: Daniel H_blog
Yo el unico problema que aun le veo es el brutal gasto de procesador. Es bastante intensivo.
Por: Freddie
El uso de procesador baja sensiblemente si se usa setInterval en vez de onEnterFrame. Aquí un ejemplo de como quedaría con el efecto lago:

Código :

import flash.display.BitmapData;
import flash.geom.*;
import flash.filters.*;
img = BitmapData.loadBitmap("imagen");
attachBitmap(img, 1);
createEmptyMovieClip("sal", 0);
sal.attachBitmap(img, 0);
sal._y = 2*img.height;
sal._yscale = -100;
ola = new BitmapData(img.width, img.height);
pt = new Point();
dM = new DisplacementMapFilter(ola, new Point(), 1, 1, 0, 40, "ignore");
sal.cacheAsBitmap = true;
setInterval(this, "efectoLago", 100);
efectoLago = function () {
   pt.y -= .3;
   pt.x -= 1.7;
   ola.perlinNoise(20, 4, 1, 0, true, true, 1, true, [pt]);
   sal.filters = [dM];
};

Por: Freddie
Exactamente Freddie.
Lo mejor forma de implementerlos en una aplicación concreta, (tanto este como los otros efectos que usan desplazamiento+perlin) es con setInterval.
En la corrección que posteé en el efecto de agua para que se detuviera completamente ( ese esel código final que yo uso, no el ejemplo) ya advertía que la mejor manera era con setInterval y así está en ese código.
Además, su uso como función permite manejar el lapso como variable cosa muy util en ciertas ocasiones acelerando o ralentizando el efecto al gusto.
Toy d´acuerdo ^^
Por: Teseo
no lo puede implementar ayuda porfavor
Por: champydelico_blog
No entiendo NADA, como lo hago? un paso a paso puede ser? el archivo *.fla tambien vendria bien asi me entero de como se hace.
Por: elGafas
hola soy algo novato con esto del AS, no entendi muy bien como usar este efecto, son clases las que manda a llamar al inicio, de donde salen o que onda, ya vienen con flash o hay que conseguirlas, si es posible explicarlo un poco mas a detalle seria bueno, gracias por su tiempo, realmente he aprendido mucho de ustedes,
Por: josluigtz_blog
Flipante! Muchas gracias, Teseo! Eres una maquina!
Por: Komotuporaki_blog
Donde hay que colocar el codigo? como hay que hacer con la imagen para dividirla. No termino de entender el tutorial. Sería de gran ayuda un archivo ya funcionando. Gracias
Por: Boris_blog
No hay que hacer nada más que:
1) Poner la imagen en la biblioteca del FLA. y vincularla con el nombre "imagen" OJO : vincularla no es ponerla en el escenario. Colocar u MC, gráfico o botón en el Escenario y darle nombre de instancia es "instanciar", no es "vincular para attach".
Instrucciones para vincular una imagen que está en la biblioteca:
1) En la biblioteca pones una imagen llamada digamos "paisaje".
2) Pinchas con ratón derecho sobre su icono en la biblioteca.
3) Pinchas en vinculación en el menú que aparece.
4) En la ventana que sigue: Propiedades de vinculación marcas Exportar para ActionScript , marcará también Exportar en primer fotograma, déjalo marcado. En identificador pon imagen (ese es el nombre que buscará el script para cargarlo en attach). Deja la entrada de Clase AS2 en blanco. pulsa Aceptar. Si todo ha ido bien, en las columnas de la biblioteca verás: nombre, tipo, nº de usos, y en vinculación la palabra imagen.
2) Colocar el código en acciones del primer frame.

YA ESTA!!

Si es el caso modificar algunos parametros que se deseen al gusto. El codigo hace todo lo necesario para duplicar la imagen, colocarla..espejarla etc...

Y repito: para consultas hay un post donde hacerlas ya indicado arriba en el ejemplo.
Por: Teseo
Gracias por este excelente tutorial
Por: G Creator_blog
Muy bueno, podíais explicar el efecto espejo tan utilizado últimamente en los logos de letras.

http://www.isspal.com
Por: Jose Manuel_blog
no entendi correctamente
Por: nemesis_blog
Todos tus tips son de lujo, espero que sigan llegando :D

Tienes mucho talento.
Por: DanielSemper
Oye una pregunta, se pueden tener los mismos resultados con vectores?? ... no se si me explico, por ejemplo: creo un circulo lo guardo en la biblioteca como un MC y lo vinculo con el nombre de "imagen"...te pregunto por que intente hacerlo asi y no muestra nada... digo tal vez sea por la clase de BitmapData que solo lee imagenes y no vectores.. o estoy en un error??
Por: hdm_blog
Puedes hacerlo con MCs.
Pero entonces no hay imagen que cargar.
Forma sencilla:
Pones el MC en el escenario con nombre de instancia digamos efectola.
y cambias este trozo de código:

Código :

img = BitmapData.loadBitmap("imagen");


Por este otro:

Código :

img = new BitmapData(efectola._width, efectola._height);
img.draw(efectola);

El resto igual y ya lo tienes. no te olvides de hacer no visible la instancia de efectoola. Es más despues del código la puedes hasta borrar si quieres.
Por: Teseo
Hola chikos me llamo raul sabe yo soy nuevo en esto no se nada del scrip nada de nada algunas cosas se un poko de visual basis y las creaciones de variables son parecidasa asi que casi to lo entiendo alguien tiene algun manuel basico de actionscript porfas pasemelo quiero aprender sobre estoy ayudenme mi correo es dark_166@hotmail.com siempre entro a la pagina a ver las animaciones pero cuando me las descargo no se puede abrir no se por que :(
Por: SoulGothic_blog
alguno de ustedes me podria mandar el .fla o decirme bien que hacer para el efecto lago por favor?
Por: mario_blog
Hola hola muy bueno el truco, felicidades pero como le podria hacer si tengo un clip vacio y almacenara diferentes imagenes , claro el efecto se lo tengo que poner al clip vacion donde carga la imagen para que el efecto de agua son diferentes, Como se podria hacer saludos.
Por: joshuavw
Muy buena tu creatividad, felicitaciones por el efecto.
Por: Edg@rNet_blog
q feo esta toono tienen creatividad!!
Por: gladys_blog
vaya cracks, que buenos soys
Por: lineagrafica
Por favor ¿me podeis decir como colocar la imagen en un sitio determinado? como no puedo mover la imagen al escenario no se como moverla. gracias.
Por: alvaro_blog
me gustaría saber también como puedo hacer este efecto, pero no en el primer fotograma, si no inlcluirlo en otro fotograma más adelante. Me explico, yo quiero hacer una película que empieza con otro efecto y que después aparezca este efecto de agua.
Por: alvaro_blog
Soy nueva en esto, por favor me puedes indicar como coloco la imagen en la biblioteca???
Por: Rubí_blog
ayuda, nose donde va el código
Por: Criss_blog
me funciono... lei de nuevo la explicación
mil gracias
Por: Criss_blog
deseo mover el efecto porque meaprece en el punto (0,0) con todo e imagen como lo muevo a otro punto
Por: nikolas_blog
el codigo donde se pone en el frame o un movie clip!!!
Por: erika_blog
Me encantò este efecto... ahora solo tengo un problema y espealguien me pueda ayudar.
Quiero este efecto de fondo,pero no me permite poner encima ni texto ni nada... ya probè cargandolo como movie externa en otro archivo, y tampoco, y no pude cargarla por ej en el nivel 0 y despuès cargar el texto en, por ej, el nivel 3... que puedo hacer?
gracias.
Por: Ana_blog
Ok, ya lo resolvì... si a alguien le sirve, se carga una peli externa en el mismo archivo y ahi ya se pueden meter los demàs elementos....
Por: Ana_blog
Me intereso este efecto, pero a lo ke no le entendi fue a lo de: "hacemos una división de la imagen en tres partes de 1/6, 2/6(1/3) y 3/6(1/2) y aplicamos los desplazamientos y filtros independientemente".
Me podria alguien explicar por favor.
Por: Dayanne_blog
Hola saben tengo una gran duda y spero q alguien me pueda ayudar..... tngo q hacer un juego en flash de vestir a una muñek pero me fallan mucho los codigos....nececito q alguien me de una corta explikcion o si saben de alguna pagina para sakr el juego. grax
Por: Marissa_blog
mi mail es: l_llopez@yahoo.com.ar
Muchas gracias por su ayuda!
Por: Luisina_blog
Necesito URGENTEMENTE el efecto del lago. No se mucho sobre Flash, ni mucho menos de programacion.
Me pueden explicar paso a paso de como hacer el efecto? No entiendo la vinculacion de la imagen. AYUDA POR FAVOR!
Mi mail es: l_llopez@yahoo.com.ar

Muchas gracias!
Por: Luisina_blog
Excelente efecto, solo que tengo un pequeño inconveniente, no logro colocarle texto y otra Imagen encima, por favor si alguien me colabora, Muchas pero muchas Gracias.
Muy agradecido por este tutorial, bye.
Por: Ferc_blog
Auxilio, como colocar texto o imagen sobre el efecto lago….Úrgeme, muchas gracias….visualiza@hotmail.com
Por: Ferc, visualiza@hotmai
Teseo: Muchas Gracias por compartir tus conocimientos con nosotros, Quiero colocarle Texto y Imagen al Efecto lago, como hago? Muchas gracias Nuevamente...
Por: visualiza@hotmail.com_blo
solo me funciona el efecto cascada el ultimo los otros 2 no me salen a pesar que copio el codigo lo pongo en el primer fotograma y vinculo la imagen para action script
Por: Luis Vera_blog
el de la kaskada no es mui real ehh
Por: we_blog
Hola a todos soy principiante en el Flash y necesito aprender como dar efecto de agua, esto es para simular la caida en una represa hidroelectrica, porfa alguien que me pueda explicar
Por: Pancho_blog
hola

puedes explicar mejor la parte 'división de la imagen en tres partes de 1/6, 2/6(1/3) y 3/6(1/2) y aplicamos los desplazamientos y filtros independientemente' es que soy novato y no entiendo.

gracias
Por: fench_blog
quisiera saber como hacer un menu desplegable que no se mut dificil
Por: jaime _blog
quiero diseñar una pagina web no se como hacer
Por: jaime_blog
Hola
Me parecen unos efectos excelentes y me gustaria poner estos efectos a unas fotos mias, el problema es que no se na de computacion agradecere si algien me gia paso por paso, muchisimas gracias y felicidades.
expertos ayuda.
Por: frameva-blog
perdon mi correo es
frameva@yahoo.con.mx
Por: frameva-blog
hola gente: primero debe felicitar a teseo, los efectos son geniales!!!
Ahora, yo utilicé el efecto del lago, me salió ok, pero quiciera superponer a la imagen un marco transparente (solo el contorno) ya sea un png o vectores.

Como puedo hacerlo, el attach no me salió, pero creo que por errores de sintaxis.

Alguien me ayuda?

gracias
Por: marcelo-vercillo-blog
lo probe de varias formas y son bien sencillos de implementar ,grande amigo!
Por: gonpru
La verdad que se ven excelente los efectos, he tratado de haceros con flash css3 y no puedo, hay alguien que pueda explicarlo como para un idiota, ese seria yo, un fuerte abrazo
Por: Pablo-blog
Otra cosa amigos, estarie muy bien si estos ejemplos se pudieran tener en flash,fla, asi poder intenderlos un poco mas que en el codigo, muchos de nosotros no entendemos, y lo novatos en la web de CristaLab :) saludos
Por: Pablo-blog
tngo un problema ya ke mi imagen es de 800 x 600 y al dupilar el lienzo keda demaciado grande y se ve mal....... me podrias decir komo arreglarlo te lo agradecira muxo
Por: cintia-blog
megusta las servas pero no megusta que lagente echen perder estas cosas tan bonitas que sino llano es selva por lacontaminacion que cortan los arvoles
Por: ivan-blog
esta genial, muchas gracias
Por: jaz-blog
hola teseo una pregunta resulta que he utilizados estos codigos en algunas amimaciones, pero al memento en que visualizan tienden a consumir bastante recurso del sistema y por consiguiente lento, especialmente en los portatiles, esto no se si por que mi bitmap es una imagen de 1600x1200 y trabaja a fullscren, me ayudas por fa?
Por: wsebastian-blog
porfavor necesito saber con urgencia como puedo poner objetos encima de la animacion pues todo sale debajo
Por: juan mu;oz-blog
me salio el de la cascada, pero el del lago y el rio no...por que? si ya copie el codigo, vincule la img correctamente, le di el nombre de instancia a un movieclip vacio...que me esta faltando???
Por: grado13-blog
No, no entiendo aun, como los demas users necesitan URGENTEMENTE algo, sin darse los 5 minutos necesarios para leer y razonar? soy novato, y cargar un codigo, y vincular una imagen no me convierte en mas experto... tengo mi flash 8 portable, en ingles, y con mas problemas que la carpeta de examenes de matematicas. Aun asi, leo, y si no me sale a la primera, sigo intentando. Y, creanme, si sobrevivi todo este tiempo, sin el efeto, aun puedo sobrevivir sin el efecto, hasta que me salga. Agradezco a quienes se han tomado la molestia para escribir esto...
Por: Matias-blog

Matias-blog :

Agradezco a quienes se han tomado la molestia para escribir esto...
Si todos fueran como tú, Matias :cry:
Por: Freddie
Hola, gracias por el efecto, pero porfavor si alguien podria indicarme como ponerle texto a mi pelicula q tiene ese efecto.
Por: Giga-blog
Crea una nueva capa, por encima de la capa que tiene el efecto. Y insertas un campo de texto.
Por: Sisco
Ya lo hice pero no se puede, solo sale el efecto :s help me please!!!!
Por: Giga-blog
me gustan muchos sus efectos del agua, es codigo libre, como los puedo adecuar a una forma que no sea un cuadrado o rectangulo
Por: carlos -blog
perdon se me olvidaba gracias
Por: carlos -blog
Buenas Tardes... muy pasado muy volado estos efectos y sencillo al aplicarlo; pero tengo una inquietud:
- Si anexo mas Capas con animaciones, textos, graficos, etc.
Pork que no me las muestra estas Capas, si el efecto de lago esta debajo de estas capas; en el caso de Aplicar este efecto como una fondo o backgrond, para al alguna multimedia.
- O si es mejor o debido hacer load movies?
Agradesco antemano que meatuden enla duda!
Gracias :D:)
Por: BIODEMON
Buenas.. yo cargo una imgen desde un url pero no puedo escribir encima.. sera q alguein me puede ayudar con eso?? se lo agradeceria mucho..
Por: Zeus-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.