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.
¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.
Por Eliseo el 21 de Noviembre de 2008
Por Rafeo el 21 de Noviembre de 2008
Por Zguillez el 21 de Noviembre de 2008
Pasar datos desde los eventos es necesario en muchos casos..
pd: tambien te me adelantaste Y_Y
Por Jakov! el 21 de Noviembre de 2008
Por Zguillez el 21 de Noviembre de 2008
Jakov!-blog :
Donde unos ven un ejemplo del uso de eventos otros ven un ejemplo de una pelotita que salta...
en fin..
Ya lo dicen.. "Cuando el dedo señala al cielo..."
Por prueba el 21 de Noviembre de 2008
Por bryanisimo el 21 de Noviembre de 2008
Por betdam el 23 de Noviembre de 2008
Qué buena, en todo el día estaba "asado". Tus comentarios me han hecho reir.
Por emedinaa el 08 de Diciembre de 2008
Por InoX el 27 de Octubre de 2009
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 el 27 de Octubre de 2009
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 el 27 de Octubre de 2009
InoX-blog :
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 pulgOsO el 11 de Mayo de 2010
Por atonab el 15 de Junio de 2010
**Claro todo esto haciendolo por medio de clases ¿Es algo asi el pasar los datos?
Por lucasmoyano el 04 de Octubre de 2010
Por HiddenHlF el 17 de Abril de 2011
Por xpumax el 25 de Marzo de 2012
Por Otaku RzO el 27 de Marzo de 2012
Este post no es "Como hacer con eventos que una bola salte", sino "Crear Eventos Personalizados".
Dependiendo de la situación escogeras crearlos. Solo plantee un caso.
Es una buena practica darle un orden al código y esto ayuda.
Por Carnabelanfuro el 29 de Mayo de 2013
Por Otaku RzO el 29 de Mayo de 2013
El super() solo funciona en el contructor de una clase que extiendo de otra.
Por xpumax el 30 de Mayo de 2013
En la clase MovilEvent, la funcion constructora.
Código :
Que es lo que hace "super(type, bubbles, cancelable)" ? En ningun momento veo declarada la propiedad "super". ¿O es que es una propiedad de Flash?