Foros del Web » Creando para Internet » Flash y Actionscript »

[Tutorial] Efectos de nieve, ceniza, fuego, agua en Flash. AS3

Estas en el tema de [Tutorial] Efectos de nieve, ceniza, fuego, agua en Flash. AS3 en el foro de Flash y Actionscript en Foros del Web. Objetivo Al finalizar el tutorial, tendras el conocimiento necesario para programar un comportamiento de particulas en flash, ideal para implementar efectos de fluidos comunes en ...
  #1 (permalink)  
Antiguo 21/12/2010, 21:49
 
Fecha de Ingreso: junio-2010
Ubicación: Charlotte, NC
Mensajes: 611
Antigüedad: 13 años, 10 meses
Puntos: 95
[Tutorial] Efectos de nieve, ceniza, fuego, agua en Flash. AS3

Objetivo
Al finalizar el tutorial, tendras el conocimiento necesario para programar un comportamiento de particulas en flash, ideal para implementar efectos de fluidos comunes en la animacion, tales como: humo, agua, nieve, fuego, ceniza, sangre, entre otros.

Requisitos:
  • Adobe Flash CS3 o superior.
  • Conocimientos minimos de programacion orientada a objetos.
Preparando el ambiente de trabajo
Crear un archivo Flash ActionScript 3.0 Nuevo

Guarda el archivo creado con cualquier nombre. Yo lo llamare cenizas.fla.
Crear un archivo ActionScript:

Guardar el archivo ActionScript con la misma ubicación que el archivo anterior. Yo lo llamare efecto.as

Regresar al archivo ceniza.fla, y en el panel de propiedades, en el campo Clase del documento, escribir el nombre (sin la extension) del archivo .as que acabamos de crear. Si estás siguiendo el Tutorial, deberás escribir efecto.

Tu ambiente de trabajo debe lucir de la siguiente manera:



Creacion de la particula
Regresar al entorno de diseño de flash (la pestaña que dice ceniza.fla)
Presionar Ctrl+F8
Nombrar el MovieClip
Hacer click en el botón "Avanzado"
Activar la casilla Exportar para ActionScript
Cambiar el campo de texto "Clase" por "ceniza" (sin comillas).


ADVERTENCIA: Al hacer click en Aceptar, Flash arrojara un cuadro de dialogo advirtiendo que no se ha encontrado una clase para el elemento. Hagan click en Aceptar en el cuadro de dialogo e ignorenlo, es normal que suceda esto.

La particula es un clip de pelicula convencional. La imagen que yo utilice, no es mas que un circulo con un relleno radial, y el color externo de dicho gradiente, tiene un canal alfa 0%


Sin embargo la particula puede tener la forma que sea, e incluso puede estar animada, lo cual alza el realismo del generador de particulas. La particula que yo utilice en este tutorial es esta:


Guardar los cambios en el archivo .fla. Si todo se encuentra en su lugar, al hacer click en el icono al lado de la clase del documento

Manos a la obra!
Finalmente ya estamos listos para programar.
Copia y pega el siguiente codigo en el entorno de programacion y si seguiste el tutorial al pie de la letra, el codigo compilara sin mayor problema y veras el generador de particulas en accion.

El Codigo:
Código AS3:
Ver original
  1. package{
  2.     import flash.display.*;
  3.     import flash.events.*;
  4.     import flash.media.*;
  5.     import flash.display.*;
  6.     public class efecto extends flash.display.MovieClip{
  7.  
  8.         var ancho:Number = 550;
  9.         var alto:Number = 400;
  10.         var tamanoMaximo:Number = 5;
  11.         var cenizas:Array;
  12.        
  13.         public function efecto():void
  14.         {
  15.             addEventListener(Event.ENTER_FRAME, crearEfecto);
  16.             cenizas = new Array();
  17.         }
  18.  
  19.         public function crearEfecto(e:Event)
  20.         {
  21.             crearCeniza();
  22.             elevarCeniza();
  23.         }
  24.  
  25.         public function crearCeniza()
  26.         {
  27.             var miCeniza:MovieClip;
  28.             miCeniza = new ceniza();
  29.             miCeniza.alpha = Math.random();
  30.             miCeniza.x = ancho/2
  31.             miCeniza.y = alto/2
  32.             miCeniza.scaleX = miCeniza.scaleY = Math.ceil(Math.random()*(tamanoMaximo));
  33.             miCeniza.k = 1+Math.random()*2;
  34.             miCeniza.viento = 1.5 + Math.random()*(1.4*3);
  35.             addChild(miCeniza);
  36.             miCeniza.play();
  37.             cenizas.push(miCeniza);
  38.         }
  39.         public function elevarCeniza()
  40.         {
  41.             var miCeniza = new ceniza();
  42.             for(var i:int = cenizas.length-1;i>=0;i--)
  43.             {
  44.             miCeniza = cenizas[i];
  45.             miCeniza.y -= 5+miCeniza.k
  46.             miCeniza.x += miCeniza.viento;
  47.             if((miCeniza.y < 0) || (miCeniza.x > ancho))
  48.                 {
  49.                     cenizas.splice(i,1);
  50.                     removeChild(miCeniza);
  51.                 }
  52.             }
  53.         }
  54.     }
  55. }

Pueden ver el Generador de particulas en ejecucion, en la siguiente direccion:
Generador de Particulas.
El codigo explicado

Variables globales
  • Ancho - Ancho del escenario.
  • Alto - Alto del escenario.
  • tamanoMaximo - tamanoMaximo de la particula.
  • cenizas - Array que almacenara las diferentes instancias de la particula.
Funciones

  • efecto():

    Es el constructor de la clase. El punto de entrada para el compilador. En esta funcion agregamos un Inspector de eventos que monitorea cada vez que el escenario visita el primer fotograma de la animacion. En otras palabras, al momento en el que se entre al primer fotograma del escenario se ejecutara la funcion crearEfecto().

    Como no tenemos ningun stop, El primer fotograma se ejecutara indefinidamente. Finalmente, instanciamos el array previamente declarado.

  • crearEfecto()
    Esta funcion define el orden de ejecucion, primero creamos la ceniza y luego la movemos.


  • crearCeniza()
    Para darle un efecto real ceniza, vamos a hacer que el canal alfa de cada ceniza sea un numero aleatorio entre 0 y 1.

    Posteriormente, definimos las coordenadas (X,Y) de la ceniza. En este caso la estamos posicionando al centro de la pantalla.

    Nuevamente para aumentar el realismo del efecto vamos a aleatorizar las propiedades scaleX y scaleY del MovieClip, que son las que definen el ancho y el alto respectivamente de la particula.

    Creamos "variables" internas del clip de pelicula, que podemos modificar a placer. La propiedad K, que es la que se encargara de cambiar la direccion en el eje de las Y. La propiedad viento, es la que tendra que simular el viento, que en realidad movera las particulas en el eje de las X.

    Cada ceniza que estamos creando, la vamos a almacenar en un array, del cual en la funcion elevarCeniza() obtendremos la ceniza y la moveremos.


  • elevarCeniza()
    Aqui creamos otra ceniza temporal, que es la que va a recibir la ceniza que en la funcion anterior habiamos almacenado en el array.

    El unico proposito de esta funcion es el de mover en los ejes X-Y la particula de ceniza en la posicion i del array.

    Cuando se sale de los limites de la pantalla, reducimos el tamano del array y eliminamos la ceniza de la memoria para evitar el consumo innecesario de memoria y procesamiento.

Notas Finales
Mediante el codigo podemos cambiar la direccion y orientacion de las particulas.

Si quieren que la particula vaya hacia arriba, la posicion en Y debe ir acercandose a 0.

Si la particula tiene que ir hacia abajo, la posicion en Y debe ir aumentando hasta llegar a una posicion maxima definida por el programador.

Cambiar el diseno de la particula, podemos simular diferentes fluidos. Si la hacemos roja, podemos simular un chorro sanguineo, un azul cielo, puede simular un chorro o un flujo de agua, una particula gris o roja, puede simular la ceniza de un volcan.


Cualquier duda, comentario o sugerencia favor de postearlos como respuesta a este thread, o comentarios en mi pagina personal.

Archivos
Tutorial Particulas.zip

Mirame en Ejecucion!!

Estare subiendo mas tutoriales de programacion en general, en mi pagina web personal
Tutoriales de Programacion

Etiquetas: agua, efectos, flash, nieve, tutoriales
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:08.