Tan sólo quiero actualizar los dos ejemplos que ya hay en Clab de lluvia a AS3. No se necesitan muchos conocimientos sobre AS3, tan sólo algunas nociones básicas.
Pasos a seguir :
- Para empezar, creamos un documento nuevo de Flash con AS3 del tamaño que sea, con fondo negro preferiblemente, y a 30 fotogramas por segundo.
- Después dibuja en un tamaño razonable lo que quieras que sea la gota (esto puede dar mucho juego, si en vez de que llueva agua quieres que lluevan ranas o tejones).
- Dale el nombre que te parezca y activa la exportación a ActionScript, escribiendo como nombre de la clase Gota, para este ejemplo.
- Como aún no existe, vamos a escribirla:
Código :
// Gota.as package { import flash.display.Sprite; import flash.display.Stage; import flash.events.Event; public class Gota extends Sprite { private var scale:Number = 1; private var speed:Number = 40; // La velocidad de las gotas private var angle:Number = Math.PI / 2 + .3; // El ángulo inicial en radianes public function Gota():void { // Función constructora } public function init():void { angle -= Math.random() / 5; // Añade un pelín de aleatoriedad al ángulo, línea opcional x = Math.random() * (stage.stageWidth + Math.atan(angle - Math.PI / 2) * stage.stageHeight); // Posición x aleatoria // Lo de + Math.atan(angle - Math.PI / 2) * stage.stageHeight es para que, si el // ángulo es distinto de 90º, no haya una parte de la pantalla que esté siempre // vacía. No haré las explicaciones trigonométricas. y = Math.random() * (stage.stageHeight / 2) - 100; // Posición y aleatoria // Lo de -100 es para que las gotas no empiecen tan abajo scale = Math.random() * 1.5; // Escala aleatoria, diversifica el tamaño de las gotas scaleX = scale; scaleY = scale; alpha = scale; rotation = (angle * 180 / Math.PI) - 90; // Rotación, en grados. Se resta 90º porque la inicial ya es 90º, las gotas hacia // abajo addEventListener(Event.ENTER_FRAME, movement); // Para que se muevan en cada fotograma } private function movement(evento:Event):void { y += speed * Math.sin(angle); x += speed * Math.cos(angle); // Si el ángulo es 90º (PI / 2), no se mueven en el eje x if (y > stage.stageHeight + height) { removeEventListener(Event.ENTER_FRAME, movement); stage.removeChild(this); // Si se salen, se eliminan } } } } - Creo que con los comentarios se entiende muy bien. Ahora, en el único fotograma de nuestra película:
Código :
// Archivo.fla import flash.display.Stage; import flash.events.Event; var densidad:Number = 60; var gota:Gota; function lluvia(evento:Event):void { for (i = 0; i < densidad; i++) { gota = new Gota(); stage.addChild(gota); gota.init(); } } stage.addEventListener(Event.ENTER_FRAME, lluvia);
La densidad es una constante numérica para que llueva más o menos, valores más allá de 60 son innecesarios y ralentizan el procesador.
Y ya tenemos nuestra lluvia. Aqui un bonito ejemplo:
Que aproveche
¡Saludos!
Quizás también te interesen otros tutoriales como :
- Efecto de estatica de televisión en AS3
- Efecto de agua con la clase bitmapdata
- efecto de nubes con la clase bitmapdata

Por danyrik el 08 de Junio de 2008
Estos tips siempre sirven en algun momento jaja...
saludos, buen laburo vieja
Por jose_122088 el 08 de Junio de 2008
"Chocolate rain (
Excelente =)...
Por rod el 08 de Junio de 2008
para los "webmasters" que hacen intros animadas?
Por danyrik el 08 de Junio de 2008
para los "webmasters" que hacen intros animadas?
no entendes nada pibe...
no todo sirve es para hacer una intro de una pagina... puede ser para cualquier cosa!!! animacion, jueguitos, banners, videos... de todo!!!
Gracias
Por Sickboy el 08 de Junio de 2008
para darle más realismo se deberían de escalar las gotas... y la verdad es que eso no es una lluvia... es una tromba!
Es evidente que habrá otras maneras; yo no sé lo que hacen los 'pofesionales, pero esto es una manera de automatizar el proceso.
Así no tienes que preocuparte por las profundidades ni de tener un montón de clips gota en la película principal, mezclándose con los otros elementos.
Hay que hacer una pequeña modificación en la clase Gota:
Código :
if (y > stage.stageHeight + height) { ... parent.removeChild(this); // Si se salen, se eliminan }Crear una nueva clase llamada Lluvia, que contiene básicamente el código que ya añadimos en el 1º fotograma:
Código :
package { import flash.display.Stage; import flash.display.MovieClip; import flash.events.Event; public class Lluvia extends MovieClip { var escala:Number; var densidad:Number; var gota:Gota; public function Lluvia(densidad:Number = 50):void { this.densidad = densidad; addEventListener(Event.ENTER_FRAME, llover); } private function llover(evento:Event):void { for (i = 0; i < densidad; i++) { gota = new Gota(); addChild(gota); gota.init(); } } } }Y sustituir lo que había en el 1º fotograma por:
Código :
Donde podemos poner un valor de densidad personalizado en la función constructora y, como apuntó Zah, las gotas no se mezclan con los demás objetos del escenario
P.D.: ¿Será esto añadido al tip original, o lo dejarán estar? ...
Saludos
@glsmaster: Cómo has comprobado eso?
P.D.: Perdonadme, estoy del Quijote hasta el cogote
Por Jose el 11 de Junio de 2008
Por Jose el 11 de Junio de 2008
i = _root.getNextHighestDepth();
_root.createEmptyMovieClip("control_mc", i);
control_mc.onEnterFrame = function() {
CreateRain();
};
function CreateRain() {
i = _root.getNextHighestDepth();
tmp = _root.attachMovie("lluvia", "lluvia_mc"+i, i);
tmp._x = randRange(-70, 500);
tmp._y = -10;
tmp._y = -10;
tmp._alpha = randRange(1, 40);
tmp.speed = randRange(10, 54);
tmp._yscale = randRange(50, 200);
tmp.onEnterFrame = MoveLluvia;
}
function MoveLluvia() {
this._y += this.speed;
if (this._y>340) {
removeMovieClip(this);
}
}
function randRange(min:Number, max:Number):Number {
var randomNum:Number = Math.floor(Math.random()*(max-min+1))+min;
return randomNum;
}
Y todo funciona, pero quiero que finalice la ejecución de la función en el fotograma 100 de la escena 2 porque lo siguiente es el fotograma 1 de la escena 3 y a partir de esta escena ya no quiero el efecto lluvia. Por favor, alguien me podría echar una mano?
Por Jose el 12 de Junio de 2008
He estado viendo en varios foros que existen varias líneas de código que se supone que deben dar la orden de detener la ejecución al borrar el comando onEnterFrame, que es el responsable de la ejecución indefinida. Pero lo he visto en ejemplos diferentes al mío claro, y no sé exactamente cómo encajarlo. En livedocs de Adobe he visto el siguiente artículo:
Detener repetición de código
Cuando usamos el evento ?onEnterFrame? para repetir un segmento de código, debemos tener en cuenta el momento en que hay que detenerlo para evitar problemas de rendimiento. Para esto debemos borrar el evento usado ?delete? por ejemplo:
circleClip.onEnterFrame = function() {
circleClip._alpha -= 5;
if (circleClip._alpha<=0) {
circleClip.unloadMovie();
delete this.onEnterFrame;
trace("onEnterFrame borrado");
}
};
A mí no me sirve porque lo que quiero no es que se detenga cuando alpha sea 0 sino cuando llegue al fotograma 100.
He visto este otro ejemplo aplicado a un rollOver, pero no sé cómo aplicarlo a mi ejemplo de lluvia:
//asignamos la acción del Over para que actue sobre nuestro movieclip
//que queremos reproducir
on (rollOver)
{
mc_animado.onEnterFrame = function ()
{
//le decimos a ese MC que si se encuentra en cualquier número frame
//diferente a 41, avance al siguiente; es decir, si está en el 1
//avanzará al 2, después al 3...y asi sucesivamente
if (this._currentframe != 25)
{
this.nextFrame();
}
//usando el "else" tomamos la comparativa que nos acomoda, que es "==".
//le decimos a ese MC que si se encuentra en el frame 41 se detenga
//y borre el "onEnterFrame"
else
{
this.stop();
delete this["onEnterFrame"];
} // end if
};
}
Código :
o bien dentro de la funciónCódigo :
if (this._currentframe == 100) { delete this.onEnterFrame; }?
Por Jose el 12 de Junio de 2008
delete control_mc.onEnterFrame;
Quizás es que no escriba correctamente la continuación del condicional en la función pero desde la función no va.
Muchísimas gracias Juanlu, le estaba dando tantas vueltas que ya iba a renunciar y me iba a fabricar un MC por cada fila de gotas de lluvia, colocarlas por capas y a tirar con interpolaciones de movimiento (vamos, una chapuza) Así me ha quedado bastante bien. Os iré siguiendo, sois muy buenos.
Por Eliezer el 02 de Julio de 2008
Por Jose_blog el 07 de Julio de 2008
La animación arranca con los botones que tiene incrustados y se puede navegar por ella utilizándolos. Espero que os guste, y se aceptan sugerencias para mejorarla. (Activar los altavoces, también tiene sonido)
He visto cómo has utilizado el efecto lluvia, la verdad es que te ha quedado bien. Como has dicho que estaba abierto a sugerencias, aquí van mis dos:
1. No se puede retroceder de escena, que era para lo que yo me pensaba que servía el botón de las dos flechas hacia la izquierda. A lo mejor sería bueno que fuera una escena hacia atrás, en lugar de al principio de la que estás.
2. El último fundido en negro te quedó un poco raro. Me supongo -aunque es una conjetura- que el fondo era negro y que hiciste una interpolación del alpha de todos los objetos a 0. Para conseguir el mismo efecto, prueba a utilizar un rectángulo negro del mismo tamaño del escenario por encima de todas las capas que pase de alpha 0 a 100.
Por lo demás, está bien para lo que es su función, digo yo
Por Jose_blog el 07 de Julio de 2008
Por jose el 27 de Julio de 2008
Por Joe el 01 de Agosto de 2008
Por sergio el 05 de Agosto de 2008
Por GersonM_17 el 12 de Agosto de 2008
Por Luis-bl el 16 de Agosto de 2008
1120: Acceso a una propiedad i no definida. del for(i=0;i<densidad;i++).
si me pueden ayudar lo agradeceria.
La línea que has escrito debería quedar así:
Código :
o así:
Código :
Saludos!
Por rata el 26 de Septiembre de 2008
Por Vanesa el 28 de Octubre de 2008
Un saludo!
Por Jair E. el 08 de Enero de 2009
Por juanmaoca el 12 de Enero de 2009
http://es.geocities.com/jumaoca/motoslluvia.swf
todos somos sabios unos antes y otros tardamos un poco mas
un saludo
maestros
Por juanmaoca el 01 de Febrero de 2009
Por frank el 29 de Junio de 2009
Por frank el 29 de Junio de 2009
Por gcastilo_2009 el 29 de Diciembre de 2009
gcastilo_2009-blog :
Te respondería, pero hazme el favor de escribir bien. Que no te entendí.
Por Ibol el 17 de Febrero de 2010
Por Hiatomx el 04 de Junio de 2010
Por Hiatomx el 04 de Junio de 2010
Código :
public function cambioDensidad(den:Number):void { if (den==0) { removeEventListener(Event.ENTER_FRAME, llover); densidad=den; } else { if (densidad!=0) { removeEventListener(Event.ENTER_FRAME, llover); } densidad=den; addEventListener(Event.ENTER_FRAME, llover); } }Inicialmente, densidad=0 si funciona, pero cuando hago un cambio y después regreso a 0, ya no, cae una ligera lluvia. Si alguien logra hacer que funcione al 100% la densidad=0 se le agradecerá. Saludos.
Por jonathan_13_25@hotma el 05 de Julio de 2010
Por hugo ernesto mantill el 10 de Agosto de 2010