Detectores de eventos en AS3

El manejo de eventos es el punto primordial para lograr interactividad en Flash, esto es detectar si el usuario realiza determinada acción (presiona un botón o una tecla por ejemplo) y de acuerdo a ello ejecutamos otra acción.

Utilizando Listeners
En ActionScript 3 (AS3) se ha hecho una cambio sustancial en el manejo de los eventos, se han eliminado completamente los eventos (onEnterFrame, onRollOver, onRelease, etc) y se ahora se pueden detectar la interacción utilizando listeners. Esto es si deseamos detectar un evento tenemos que agregar un listener especifico para llamar a una función cuando se detecte un evento.

[as]addEventListener(«nombreEvento», nombreFuncion);[/as]

En donde tenemos que nombreEvento es el evento que deseamos detectar y nombreFuncion es el nombre de la función que vamos a ejecutar si se detecta el evento. Por ejemplo si deseamos detectar el evento ENTER_FRAME podemos agregar el listener de la forma:

[as]addEventListener(Event.ENTER_FRAME, onEnterClip);[/as]

Hay que notar que cada vez que ocurra el ENTER_FRAME nosotros ejecutaremos una función que en nuestro caso la hemos llamado onEnterClip.

Utilizando Eventos en Linea de Tiempo
Veamos primero la forma de implementar los eventos directamente en la linea de tiempo. Sea que tengamos un MovieClip llamado clip en el escenario de nuestra película, le agregamos el detector de eventos en el cual cambiamos de posición al clip.

[as]
clip.addEventListener(Event.ENTER_FRAME, onEnterClip);
function onEnterClip(event:Event) {
clip.x = clip.x + 2;
if (clip.x > 325) {
clip.x = -25;
}
}
[/as]

Con lo cual tenemos el siguiente resultado:

[swf]/wp-content/uploads/2007/12/events-timeline.swf,300,100[/swf]

Utilizando Eventos en Clases
Veamos ahora el ejemplo anterior, pero utilizando clases, para ello primero importamos la clase flash.events.Event que nos permitirá utilizar las propiedades de los eventos.

[as]
package {
import flash.display.Sprite;
import flash.events.Event;
public class ClipEvent extends Sprite {
public var clip:Sprite;
public function ClipEvent() {
clip = new Sprite();
addChild(clip);
// dibujamos el circulo
clip.graphics.beginFill(0x0099CC);
clip.graphics.drawCircle(0, 0, 25);
clip.graphics.endFill();
clip.x = stage.stageWidth/2;
clip.y = stage.stageHeight/2;
// agregamos el listener
clip.addEventListener(Event.ENTER_FRAME,onEnterClip);
}
public function onEnterClip(event:Event):void {
clip.x = clip.x + 2;
if (clip.x > 325) {
clip.x = -25;
}
}
}
}
[/as]

Luego de exportar la película tenemos el siguiente resultado que es idéntico al ejemplo anterior.

[swf]/wp-content/uploads/2007/12/events-class.swf,300,100[/swf]

Eventos para el Mouse
En ActionScript 2 todos los eventos del mouse eran detectados (mouseUp, mouseDown, mouseMove), ahora hay que agregar un listener si se desea detectar algún evento. Esto resulta ser optimo pues solo se detectarán los eventos a los que deseamos aplicarle alguna acción mejorando así el rendimiento de nuestra película.

Entonces ahora tenemos disponible una nueva clase flash.events.MouseEvent el cual brinda todos los eventos para el mouse los cuales son: CLICK, DOUBLE_CLICK, MOUSE_DOWN, MOUSE_MOVE, MOUSE_OUT, MOUSE_OVER, MOUSE_UP, MOUSE_WHEEL, ROLL_OUT, ROLL_OVER.

Entonces si deseamos agregarle un efecto cuando se para por encima de nuestro clip, agregaríamos dos listeners de la siguiente forma:

[as]
package {
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
public class MouseClipEvent extends Sprite {
public var clip:Sprite;
public function MouseClipEvent() {
clip = new Sprite();
addChild(clip);
clip.graphics.beginFill(0x0099CC);
clip.graphics.drawCircle(0, 0, 25);
clip.graphics.endFill();
clip.x = stage.stageWidth/2;
clip.y = stage.stageHeight/2;
clip.addEventListener(Event.ENTER_FRAME,onEnterClip);
clip.addEventListener(MouseEvent.MOUSE_OVER, onOver);
clip.addEventListener(MouseEvent.MOUSE_OUT, onOut);
}
public function onOver(event:MouseEvent):void {
clip.alpha = 0.5;
}
public function onOut(event:MouseEvent):void {
clip.alpha = 1;
}
public function onEnterClip(event:Event):void {
clip.x = clip.x + 2;
if (clip.x > 325) {
clip.x = -25;
}
}
}
}
[/as]

Con lo cual obtenemos un efecto cada vez que pasamos encima del clip como se muestra a continuación.

[swf]/wp-content/uploads/2007/12/events-mouse.swf,300,100[/swf]

Eventos del Teclado
Para el caso del teclado ahora a traves de la clase flash.events.KeyboardEvent se tienen disponibles dos tipos de eventos KEY_DOWN y KEY_UP. Luego por ejemplo si deseamos controlar la posición de nuestro clip utilizando el teclado podemos tener el siguiente codigo.

[as]
package {
import flash.display.Sprite;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;

public class KeyboardClipEvent extends Sprite {
public var clip:Sprite;
public function KeyboardClipEvent() {
clip = new Sprite();
addChild(clip);
clip.graphics.beginFill(0x0099CC);
clip.graphics.drawCircle(0, 0, 25);
clip.graphics.endFill();
clip.x = stage.stageWidth/2;
clip.y = stage.stageHeight/2;
stage.addEventListener(KeyboardEvent.KEY_DOWN,onKey);
}
public function onKey(event:KeyboardEvent):void {
switch (event.keyCode) {
case Keyboard.UP :
clip.y -= 5;
break;
case Keyboard.DOWN :
clip.y += 5;
break;
case Keyboard.LEFT :
clip.x -= 5;
break;
case Keyboard.RIGHT :
clip.x += 5;
break;
default :
break;
}
}
}
}
[/as]

Ejecutando este código obtenemos el siguiente resultado:

[swf]/wp-content/uploads/2007/12/events-keyboard.swf,300,100[/swf]

Finalmente les dejo los archivos fuente de los ejemplos aqui mostrados para que puedan hacer sus practicas.

Comentarios Total 5 comentarios

Victor
Publicado: 04/01/2008 9:34 pm

Hola, hasta el momento este es el mejor ejemplo de eventos en as3 que he encontrado…y pues quisiera aclarar algunas dudillas.

Conozco bien lenguages de programación como C/C++, Java, Javascript, PHP…y entiendo los pilares de la POO, pero soy novato en ActionScript y no comprendo bien la forma en la que es compilado este.
Descargué los archivos que pusiste y corren a la perfección, el único problema es que al abrir el .fla con flash cs3, no encuentro por ningún lado en dónde colocaste el código, solo hay una escena, un fotograma vacío y ningún clip… la librería está vacía y en las acciones del fotograma no hay nada! :S

Te agradecería enormemente si me explicaras en qué lugar puedo encontrar el código en tu aplicación, o si me corrigieras en lo que esté haciendo mal.

muchas gracias y un saludo!.

unijimpe
Publicado: 05/01/2008 10:10 am

Lo que sucede es que en Flash se puede definir el classpath, es decir la clase que se reproducirá por defecto al ejecutar el swf. Esto se hace en el panel de propiedades de la película en el campo classpath donde colocas el nombre de la clase a ejecutar sin la extensión .as.

La otra forma es colocar en la primera linea de tiempo una llamada a la clase, por ejemplo si la clase se llama CreateCircle.as entonces:

new CreateCircle();

Esto hará que se ejecute la clase.

lisset vannesa taipe vargas
Publicado: 07/01/2008 9:26 am

ps los ejemplos q haces son muy cheveres e interesantes te felicito y ademas me sirvio bastante para poder desarrollar mi trabajo sobre los eventos

peter
Publicado: 10/03/2008 5:25 pm

Te agradesco un muchisimo. tengo serias dudas de todo esto y estoy aprendiendo, espero ser tan bueno en esto como tu.
gracias.

Federico
Publicado: 30/06/2008 7:42 pm

Tengo problema con el evento MOUSE_WHEEL. ME funciona bien dentro del swf, pero cuando lo inserto dentro de un html, me funciona tanto para el swf (un efecto zoom), como para el scroll del navegador (FF y IE), alguna idea de como se puede solucionar? ya que necesito que no se mueva la pagina cuando tengo el foco en el swf estoy usando AS3

gracias

 

Comentar

En este blog los comentarios están moderados, serán mostrados cuando el administrador los apruebe. Por favor, evita comentarios ofensivos u obscenos por que no serán aprobados.
Si deseas publicar código fuente debes hacerlo entre las etiquedas <code> y </code>, además debes reemplazar los carácteres < por &lt; y > por &gt;.

(Requerido)

(Requerido, no será publicado)

(Requerido)

(Tags aceptados: <a> <em> <strong> <code> <ul> <li>)