Entradas con la etiqueta ‘addEventListener’

Reparentar en AS3 con addChild

Publicado por Iván Gajate el 13 de diciembre de 2008 en AS3, Flash, Tutoriales | 15 comentarios »

Una de las cosas que permite AS3 es cambiar un objeto a la lista de visualización de otro contenedor.

Si tenemos un clip de película en el escenario principal, tal vez nos interese colocarlo dentro de otro clip, para hacerlo arrastrable, o para que adquiera las modificaciones de forma de su contenedor… pero sin tener que eliminarlo y volverlo a crear dentro, como ocurría en AS2.

Podemos asignarle los listeners en una clase y luego mandarle la referencia a cualquier otra clase por muy profunda que esté, para que haga el addChild, y nuestros listeners seguirán apuntando a las funciones de la primera clase. Brutal!

Vamos a verlo con un ejemplo sencillo pero muy común:

 

Requerimientos: Nos mandan hacer una botonera para un menú lateral, y como no nos dicen nada, pues la programamos en nuestra clase principal, le asignamos los listeners ahí para que cuando se pulse un botón, cargar otra sección en ese mismo ámbito. Como todo está al mismo nivel, es fácil recoger los eventos y actuar en consecuencia.

// Creo una botonera con 5 botones
_botonera = new Botonera(["Quienes somos", "Trabajos", "Contrátanos", "Soluciones", "Contacto"]);

// Le pongo un listener para el evento "botonPulsado" que emite cada vez que se pulsa un boton
_botonera.addEventListener("botonPulsado", opcionSeleccionada);

// La añado al escenario principal. Por defecto en el 0,0
this.addChild(_botonera);

Leer el resto de esta entrada

Emitir eventos personalizados en AS3 (II)

Publicado por Iván Gajate el 22 de noviembre de 2008 en AS3, Flash, Tutoriales | 12 comentarios »

Ya vimos que se pueden emitir eventos personalizados para recogerlos con un listener, no tenemos que limitarnos a los que trae Flash por defecto.

Ahora vamos a dar un paso más. Queremos emitir un evento que diga que se ha terminado una acción, pero además queremos indicar si ha ido bien (true), o ha ido mal (false).

Este es el evento que queremos emitir:

dispatchEvent(new EventExtra("accionTerminada", true));

Creamos un nuevo evento de tipo EventExtra donde le indicamos el nombre del evento que queremos emitir y los parámetros que queramos, que para eso es nuestro evento 🙂

Vamos a ver la clase EventExtra:

package {

	import flash.events.*;

	// Extiendo la clase Event para que funcione como un evento mas al enviarse y recibirse.
	public class EventExtra extends Event{

		public var exito:Boolean;

		public function EventExtra(nombre:String, exito:Boolean=true){
			// Inicializo el constructor de Event
			super(nombre);
			// Guardo el valor de exito en una variable para poder acceder luego a ella.
			this.exito = exito;
		}
	}
}

No tiene nada especial, es un envoltorio de la clase Event pero recibe un parámetro extra que almaceno para luego poder acceder a su valor.

Así es como se recogería nuestro evento, con un listener, como siempre en AS3:

// Escucho si objetoEmisor emite el evento "accionTerminada" y le indico su detector de eventos.
objetoEmisor.addEventListener("accionTerminada", detectorAccionTerminada)

// El detector del evento, recibe un objeto evento de tipo EventExtra
function detectorAccionTerminada(evento:EventExtra):void{
	// Como tengo una referencia al evento, puedo acceder a sus variables publicas (exito).
	trace(evento.exito)
}

Leer el resto de esta entrada

Simular un evento en AS3

Publicado por Iván Gajate el 11 de noviembre de 2008 en AS3, Flash, Tutoriales | 20 comentarios »

La gestión de eventos de AS3 es muy buena, aunque a veces nos obliga a estar demasiado «encorsetados» en el trabajo día a día.

Algo que es muy común es poner un botón con su listener y una función detectora del evento, que recibe un parámetro de tipo MouseEvent:

import flash.events.MouseEvent;

miBoton.addEventListener(MouseEvent.MOUSE_DOWN, miOnMouseDown);

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

Hasta aquí todo guay. El problema viene cuando queremos llamar a esa función directamente, sin haber pulsado el botón, por ejemplo si queremos simular la acción del usuario o ejecutar el código de miOnMouseDown nada mas entrar en la sección. Nuestra función espera un evento de tipo MouseEvent como parámetro, y si hacemos la llamada sin ese parámetro nos dará un error al compilar.

La solución pasa por pasarle un parámetro de tipo MouseEvent construido por nosotros mismos:

miOnMouseDown(new MouseEvent(MouseEvent.MOUSE_DOWN));

Leer el resto de esta entrada

Emitir eventos personalizados en AS3 (I)

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

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");
}

Leer el resto de esta entrada

Pasar parámetros al addEventListener en AS3

Publicado por Iván Gajate el 5 de noviembre de 2008 en AS3, Flash, Tutoriales | 33 comentarios »

Algo tan sencillo y resulta que no se puede ¿?

plegar_btn.addEventListener(MouseEvent.MOUSE_UP,  plegar, true);

No me deja ponerle mas parámetro tras la referencia a la función. ¿para qué sirve una función si no le puedo pasar parámetros? Y es una pena, porque con éste método ya me había olvidado del Delegate.create… 😉

Buscando por la red, la solución que mas me convence por lo sencilla y elegante es la de Wildwinter, que se ha construido una clase Callback tal y como se hacía con el Delegate de AS2, de tal manera que ahora podemos poner

plegar_btn.addEventListener(MouseEvent.MOUSE_UP, Callback.create(plegar, true));

Y con ello conseguimos poder pasar los parámetros que queramos a la función plegar. En este caso "true", pero podría ser cualquier otro, o varios.

Lo mejor de este método frente a otros es que es un "envoltorio" del verdadero evento, con lo que en la función receptora, seguiremos teniendo como primer parámetro el evento de tipo MouseEvent.

Leer el resto de esta entrada