¿Quieres registrarte?

Crear eventos personalizados en Actionscript 3

Por: Otaku RzO
20 de Noviembre del 2008

Cuando empezamos a programar en ActionScript 3 trabajamos con muchas clases y siempre tenemos que comunicarnos entre ellas de alguna forma. Una forma es usar una clase Singleton para mantener algunos datos y que sean usados en distintas clases sin perderlos. Otra forma es disparando Eventos personalizados, que será lo que mostraré a continuación con un ejemplo práctico.

Empecemos


Crearemos un movil que al darle click saltará y al caer nos avisará que ha terminado el salto. Para hacerlo necesitamos 3 clases: una para los Eventos del Movil, una para el Movil, y una para invocar al Movil y asociarla al FLA.


Estructura de nuestro proyecto.

MovilEvent.as


Esta clase extenderá de Event y la usaremos igual que cuando usamos Event pero le agregaremos las Constantes que queramos según la cantidad de eventos a necesitar. Además podemos declarar variables de tipo pública donde podemos enviar y recibir datos de este Evento.

Código :

package app.events
{
import flash.events.Event;

public class MovilEvent extends Event
{
public static const JUMP_FINISHED:String = "JUMP_FINISHED";

//Aquí pasaremos algun dato a usar. Podemos poner la cantidad de variables que queramos
public var data:String;

public function MovilEvent(type:String,bubbles:Boolean=false,cancelable:Boolean=false)
{
super(type, bubbles, cancelable);
}

}

}


Movil.as


Aquí usaremos la Clase MovilEvent para disparar nuestros Eventos para el Movil (Miren los comentarios).

Código :

package app.views
{
import fl.transitions.easing.*;
import fl.transitions.Tween;
import fl.transitions.TweenEvent;

import flash.display.Graphics;
import flash.display.Sprite;
import flash.events.MouseEvent;

import app.events.MovilEvent;

public class Movil extends Sprite
{
public var tw:Tween;
private var _jump:Boolean = false;

public function Movil()
{
// Dibujamos un circulo que nos servirá como movil
var gr:Graphics = this.graphics;
gr.beginFill(0x009966);
gr.drawCircle(0, 0, 50);
gr.endFill();
gr = null;
}

// Salta
public function jump():void
{
//Si ya esta saltando, sale
if ( _jump ) return;
_jump = true;

//Hacemos que suba 200 pixeles el movil
tw = new Tween(this, "y", Strong.easeOut, this.y, this.y - 200, .5, true);
//al terminar de moverse llamará a la función "fell"
tw.addEventListener(TweenEvent.MOTION_FINISH, fell);
}

// Cae
private function fell(e:TweenEvent):void
{
tw.removeEventListener(TweenEvent.MOTION_FINISH, fell);

//Hacemos que baje el movil
tw = new Tween(this, "y", Regular.easeIn, this.y, this.y + 200, .5, true);
//al terminar de moverse llamará a la función "fellFinished"
tw.addEventListener(TweenEvent.MOTION_FINISH, fellFinished);
}

// Termina de Caer
private function fellFinished(e:TweenEvent):void
{
tw.removeEventListener(TweenEvent.MOTION_FINISH, fellFinished);

_jump = false;

//Preparamos el evento a disparar
var evMovil:MovilEvent = new MovilEvent(MovilEvent.JUMP_FINISHED);

//llevamos alguna variable del Evento con algun dato que queramos
evMovil.data = "RAW RAW FIGHT DA POWAAA!!!";

//disparamos el evento
dispatchEvent(evMovil);
}

}

}

Aquí la parte más importante es:

Código :

//Preparamos el evento a disparar
var evMovil:MovilEvent = new MovilEvent(MovilEvent.JUMP_FINISHED);

//llevamos alguna variable del Evento con algun dato que queramos
evMovil.data = "RAW RAW FIGHT DA POWAAA!!!";

//disparamos el evento
dispatchEvent(evMovil);

Y si queremos hacerlo sin usar variables sería:

Código :

//disparamos el evento
dispatchEvent( new MovilEvent(MovilEvent.JUMP_FINISHED) );


Main.as


Aquí le daremos uso al Movil con todo lo que preparamos.

Código :

package app
{
import flash.display.MovieClip;
import flash.events.MouseEvent;
import flash.text.TextField;

import app.events.MovilEvent;
import app.views.Movil;

// Para este ejemplo añadiremos un TextField al escenario y lo llamaremos "txtTrace"
public class Main extends MovieClip
{
private var myMovil:Movil;

public function Main()
{
myMovil = new Movil();
myMovil.x = 200;
myMovil.y = 300;

myMovil.addEventListener(MouseEvent.CLICK, movil_onClick);
myMovil.addEventListener(MovilEvent.JUMP_FINISHED, movil_onJumpFinished);

this.addChild(myMovil);
}

private function movil_onJumpFinished(e:MovilEvent):void
{
txtTrace.text = "data:" + e.data;
}

private function movil_onClick(e:MouseEvent):void
{
txtTrace.text = "";
myMovil.jump();
}
}
}

La parte importante es:

Código :

myMovil.addEventListener(MovilEvent.JUMP_FINISHED, movil_onJumpFinished);
Donde escucharemos al evento JUMP_FINISHED.

Esta clase la usaremos como la Clase del Documento (DocumentClass) del archivo Main.Fla :


Y el ejemplo quedaría así:



Conclusión


Como ven en el ejemplo gracias a la clase MovilEvent comunique desde la Clase Movil a la Clase Main un evento y además pase un dato.
En nuestros desarrollos siempre se nos presentarán estos casos en lo que requerimos de un dato que esta dentro de una clase que además esta dentro de otra clase. Lo que más me gusta es que el código queda limpio y no necesitaremos de Clases de tipo Singleton para pasar datos y que mejor que junto con eventos :) .

Espero les sirva a muchos.

Archivos del Ejemplo: descargar.

Enviar a twitter Enviar a facebook


También te interesa


Etiquetas flash actionscript_3 eventos

Comentarios | Enviar un comentario
So pena que haya más de una clase que "salte", personalmente, me hubiera ahorrado la Clase MovilEvent (es sólo incluir la constante y la variable en nuestra Clase Movil).
Por: Eliseo-blog
Muy buen ejemplo, me ganaste en escribirlo , muy útiles los eventos personalizados ;).
Por: Rafeo
Buen tip (y)
Pasar datos desde los eventos es necesario en muchos casos.. ;)

pd: tambien te me adelantaste Y_Y
Por: Zguillez
O.O cielos para hacer saltar una pelotita se escribe tanto...
Por: Jakov!-blog

Jakov!-blog :

O.O cielos para hacer saltar una pelotita se escribe tanto...

Donde unos ven un ejemplo del uso de eventos otros ven un ejemplo de una pelotita que salta...
en fin.. U_U
Ya lo dicen.. "Cuando el dedo señala al cielo..."
Por: Zguillez
prueba
Por: prueba-blog
Bien =), eso lo ahcía con métdos muy ratos pero creo que con esto quedará mejor, gracias =)
Por: bryanisimo
Jakov!-blog
Qué buena, en todo el día estaba "asado". Tus comentarios me han hecho reir.
Por: betdam-blog
Intersante aporte, aunque el tween opaca la idea principal de lo q quieres mostrar ("Eventos").Rellenar el singleton de variables de distintas clases pudiendo hacerlo con los eventos, eso es fenomenal :)
Por: asphyk
Un aporte muy bueno, al contrario de lo que dice asphyk, pienso que el los TW le dan consistencia al proceso y se entiende que el evento no es despachado hasta que se termina la animación, personalmente me despejaste muchas dudas Tips como estos son los que de verdad enseñan un proceso completo de programación?..como son los eventos personalizados.

También me resulto en combinación de este Tip un tutorial que encontré aquí realizado por Iván Gajate al cual también le doy las gracias por su claridad en su aporte?

Este otro aporte hecho por Pieter Helsen no esta de mas leérselo pero lo trata de una forma menos concisa? aquí.

Salu2 y que la fuerza les acompañe?..
Por: InoX
estos son los links:

Iván Gajate --> http://www.yporqueno.es/blog/tag/dispatchevent

Pieter Helsen --> http://geo.creativecow.net/es/th/190/864641/1

copien y peguen no funcionan los links
Por: InoX

InoX-blog :

Un aporte muy bueno, al contrario de lo que dice asphyk, pienso que el los TW le dan consistencia al proceso y se entiende que el evento no es despachado hasta que se termina la animación, personalmente me despejaste muchas dudas Tips como estos son los que de verdad enseñan un proceso completo de programación?..como son los eventos personalizados.

También me resulto en combinación de este Tip un tutorial que encontré aquí realizado por Iván Gajate al cual también le doy las gracias por su claridad en su aporte?

Este otro aporte hecho por Pieter Helsen no esta de mas leérselo pero lo trata de una forma menos concisa? aquí.

Salu2 y que la fuerza les acompañe...
:wink:
Por: InoX
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.