Modelo de comunicación basado en eventos para AS2

La lógica es sencilla: un objeto Emisor actúa como lanzador de cierto Evento, mientras que otro objeto Receptor escucha cierto Evento lanzado por un Emisor para hacer cualquier cosa. Tras muchas peleas ésta es la solución para ActionScript 2 que me ha proporcionado Zárate. En este ejemplo uso la librería GDispatcher de Grant Skinner, que añade a la de Flash varias funcionalidades para hacer más sencilla y potente la comunicación mediante eventos.

Por un lado tenemos el Emisor, que a los 2000 ms de ser instanciado crea el evento de tipo “miEvento” y lo lanza:

/**
 * @author jmaestre
 * @description Objeto Emisor, una vez instanciado lanza el evento "miEvento"
 */
import com.gskinner.events.GDispatcher;

class tests.events.Emisor {
	public var addEventListener:Function;
	public var removeEventListener:Function;
	private var dispatchEvent:Function;
	private var myInterval:Number;

	function Emisor(){

		GDispatcher.initialize(this);
		// Lanza el evento a los dos segundos
		this.myInterval = setInterval(this,"lanzaEvento",2000);

	}

	function lanzaEvento(){

		// Creación del objeto evento
		var ev:Object = new Object();
		ev.type = "miEvento";
		ev.msg = "Zarate rocks!"

		// Evento lanzado para quien los escuche...
		dispatchEvent(ev);
		trace('Evento lanzado...');

		// Soy muy limpito y cancelo en intervalo
		clearInterval(this.myInterval);

	}

}

Por otro lado tenemos al Receptor, que se pone a escuchar los eventos de tipo “miEvento” que lance el Emisor:

/**
 * @author jmaestre
 * @description Objeto Receptor, una vez instanciado se pone a escuchar el evento
 *   "miEvento" sobre el obj_emisor
 */
import tests.events.Emisor;

class tests.events.Receptor {

	function Receptor(obj_emisor:Emisor){

		// Me pongo a escuchar el evento 'mievento' al objeto emisor:obj_emisor,
		// y al recibirlo invoco a mi método 'handler'
		obj_emisor.addEventListener("miEvento",this,"handler");

	}

	function handler(ev:Object){

		trace("Mensaje recibido: > " + ev.msg);

	}

}

Y finalmente, la función principal que instancia ambos y le indica al Receptor a quien tiene que escuchar:

/**
 * @author jmaestre
 * @description Objeto de prueba, instancia Emisor y Receptor
 *    y le indica al Receptor a quien tiene que escuchar
 */
import tests.events.Emisor;
import tests.events.Receptor;

class tests.events.TestEventModel {

	static public function main(){
		trace(Flashout.DEBUG +"Flashout.DEBUG" ); //Necesaria para Flashout

		//Creo Emisor
		var obj_emisor:Emisor = new Emisor();

		//Creo Receptor, diciéndole el Emisor al que tiene que escuchar
		var obj_receptor:Receptor = new Receptor(obj_emisor);
	}
}

Gol en propia puerta

George the Robot

UML y Flash

Geoetiquetado hecho fácil