Perdón por republicar esta entrada

Es que borré la original sin querer (¡WordPress ni siquiera me pidió confirmación!). Por suerte la pude recuperar (gracias a Dios Google).

Sé que últimamente somos muchos los que nos estamos metiendo en la programación para Flash, en Actionscript 3.0. Y no me extraña porque, como ya dije hace poco, flash está empezando a ser algo muy interesante. Por eso, he decidido que voy a intentar ir enseñando las cosas más interesantes que vaya aprendiendo sobre AS 3.0. Quizás ayude a alguien.

Extender la clase Event:

Para empezar, he elegido algo sencillo pero muy útil: Extender la clase Event que tanto se usa en Actionscript.

¿Para qué?

Para muchísimas cosas: Si ya estás habituado a programar en Actionscript 3.0, te habrás dado cuenta de la enorme importancia e utilidad que tienen los eventos. Pues imagínate que necesitas pasar cierta información adicional junto al evento cuando lo lanzas (unas coordenadas indicando dónde se produjo, un texto explicando qué ha ocurrido, etc…). Eso se consigue extendiendo la clase Event.

¿Cómo?

Pues no puede ser más sencillo. Simplemente tenemos que extender la clase, igual que haríamos para conseguir una herencia entre dos clases normales. Lo único en lo que debemos fijarnos es en que sobreescribimos la función clone() de la clase Event.

Y ya está. Con eso ya tenemos nuestro propio tipo de eventos que podemos lanzar como se hace siempre:

dispatchEvent(new MyEvent(EVENTO));

¿Algún ejemplo?

Desde luego. A continuación un ejemplo muy sencillo para que veas qué tipo de cosas se pueden hacer.

Eventos posicionados

Imagínate que tienes una clase Enemigo que lanza un evento cada vez que un objeto de la clase muere, y quieres hacer que salga un charco de sangre en el punto en que muere. Pues extendiendo la clase Event puedes conseguirlo de forma sencilla y elegante:

package DataTypes
{
import flash.events.Event;

/**
* Evento posicionado
* @author Miguel Santirso
*/
public class PositionedEvent extends Event
{
/**
* Posición en la que se ha producido el evento
*/
protected var position_:My2DVector = new My2DVector(0, 0);

/**
* Constructor del evento
* @param	eventPosition Posición en la que se ha producido el evento
*/
public function PositionedEvent(type:String, eventPosition:My2DVector, bubbles:Boolean = false, cancelable:Boolean = false)
{
// Hay que llamar al constructor a mano. Si no, falla.
super(type, bubbles, cancelable);

// Guardamos la posición que nos pasan como parámetro.
position_ = eventPosition;
}

/**
* Retorna una copia del evento
* @return Event copia del evento
*/
override public function clone():Event
{
return new PositionedEvent(type, position_, bubbles, cancelable);
}

// Creamos un getter para que se pueda acceder a la posición del evento.
public function get position():My2DVector { return position_; }
}
}

Una vez tenemos esto, tendríamos que indicar la posición cada vez que lanzamos el evento:

// Lanzar el evento posicionando, indicando la posición donde se ha producido
dispatchEvent( new PositionedEvent(ENEMIGO_MUERTO, new My2DVector(this.x, this.y)) );

Ahora, en la clase que queramos que controle la aparición de la sangre, tendríamos que añadir un EventListener para el evento y ya estaría:

...
// Añadir el EventListener para que se llame a la función enemigoMuertoEventListener cada vez que se produzca
addEventListener(Enemigo.ENEMIGO_MUERTO, enemigoMuertoEventListener);
...
public function enemigoMuertoEventListener(e:PositionedEvent):void
{
// Llamamos a la función que se ocupe de dibujar el charco de sangre en la posición adecuada
crearCharcoSangre(e.position.x, e.position.y);
}

Más información:

Deja una Respuesta