Emitir eventos personalizados en AS3 (I)

Publicado por Iván Gajate el 9 de noviembre de 2008 en AS3, Flash, Tutoriales

Ahora en AS3 es mucho mas fácil emitir un evento personalizado desde un objeto y recogerlo con un listener. Se hace mediante dispatchEvent.

Al igual que cuando queremos recoger el evento de ratón mouseDown lo hacemos así:

import flash.events.MouseEvent;

boton_btn.addEventListener("mouseDown", botonPulsado);

function botonPulsado(evento:MouseEvent):void{
	trace("Boton pulsado!!");
}

también podemos hacer que nuestros objetos emitan eventos para que otros objetos puedan recogerlos con un listener.

En AS3 todos los objetos que hereden de alguna subclase de DisplayObject (todos los de la lista de visualización) pueden emitir eventos, con lo que si nuestra clase extiende de Sprite, que será lo mas normal, pues ya podemos hacerlo.

Para emitir un evento haremos esto:

dispatchEvent(new Event("accionTerminada"));

donde accionTerminada es nuestro evento personalizado. Para recoger este evento usamos un listener:

import flash.events.Event;

emisor.addEventListener("accionTerminada", onAccionTerminada)

function onAccionTerminada(evento:Event):void{
	trace("Accion Terminada");
}

Lo mejor de todo esto, es que el evento de tipo Event, mantiene la misma estructura que el resto de eventos, por lo que podemos acceder de forma sencilla al emisor del evento mediante el target, y acceder así a sus métodos y propiedades públicas:

function onAccionTerminada(evento:Event):void{
	trace("accionTerminada");
	trace(evento.target);  // Devuelve una referencia al objeto emisor
}

Al igual que con el mouseDown, no es aconsejable escribir el evento entrecomillado, lo hemos hecho así para entender mejor el ejemplo, pero realmente se accedería a través de MouseEvent.MOUSE_DOWN.

Podemos guardar una constante con el string de nuestro evento dentro de nuestra clase:

public static const ACCION_TERMINADA:String = "accionTerminada";

Y para recoger el evento ahora escribiremos

import flash.events.Event;
import miClase;

emisor.addEventListener(miClase.ACCION_TERMINADA, onAccionTerminada)

aprovechándonos así de la comprobación de tipos y manteniendo la encapsulación.

También podemos aprovechar que es nuestro evento personalizado para pasarle variables y luego poder recogerlas.

 

7 comentarios para “Emitir eventos personalizados en AS3 (I)”

  1. exelente, me ayudo mucho en algo que estoy haciendo gracias.

  2. Hola Richard,
    lo que comentas es muy correcto, sin embargo es más cómodo si haces que tu clase extienda eventDispatcher y ya lo tienes hecho :D

  3. Muchas Gracias, esto me ayudó muchisimo…

    Y quiero dejar mi aporte tambien…
    Lo que quise lograr, fue agregar un Evento a una clase que mismo cree…
    y como dice el tercer parrafo:

    “En AS3 todos los objetos que hereden de alguna subclase de DisplayObject (todos los de la lista de visualización) pueden emitir eventos, con lo que si nuestra clase extiende de Sprite, que será lo mas normal, pues ya podemos hacerlo.”

    Lo que primero probé fue que mi clase propia extendiera a la Clase Sprite… y funcionó perfecto… pero me estorbaba un poco el que mi clase personal tuviera tantas propiedades sin ocupar. Pues obviamente tenía un objeto Sprite + las propiedades de mi clase propia.

    Esto lo solucioné usando la interfaz IEventDispatcher de esta forma:

    public class Propia implements IEventDispatcher

    esto me obligo a hacer dos cosas a mi clase:
    1º incluir un atributo, y
    2º agregar las 5 funciones que la interfaz IEventDispatcher, me obligó.
    y eso es todo… funcionó perfecto, y mi clase propia ahora genera eventos… Muchas Gracias
    incluyo el atributo y las definiciones de las 5 funciones.


    (obviamente, import flash.events.*;)
    private var eventDispatcher:EventDispatcher = new EventDispatcher();


    public function addEventListener(type:String, listener:Function, useCapture:Boolean=false, priority:int=0,
    useWeakReference:Boolean=false):void {
    eventDispatcher.addEventListener(type, listener, useCapture, priority, useWeakReference);
    }
    public function removeEventListener(type:String, listener:Function, useCapture:Boolean=false):void{
    eventDispatcher.removeEventListener(type, listener, useCapture);
    }
    public function dispatchEvent(event:Event):Boolean {
    return eventDispatcher.dispatchEvent(event);
    }
    public function hasEventListener(type:String):Boolean {
    return eventDispatcher.hasEventListener(type);
    }
    public function willTrigger(type:String):Boolean {
    return eventDispatcher.willTrigger(type);
    }

  4. Me ha venido perfecto, gracias.

  5. Un tuto estupendo sobre como funcionan los eventos en AS3
    http://flash.tutsplus.com/tutorials/actionscript/a-close-look-at-the-actionscript-30-event-framework/

  6. [...] También podemos aprovechar que es nuestro evento personalizado para pasarle variables y luego poder recogerlas. [...]

  7. [...] crearnos un evento genérico donde incluiremos todos los parámetros extra que queramos [...]

Deja un comentario