Comunidad de diseño web y desarrollo en internet

Incluir parámetros propios en los eventos de Actionscript 3

Me envían un correo diciéndome que tienen un menú con diversos botones y les gustaría que al momento de recibir el evento MouseEvent.CLICK que este incluya parámetros propios para así poder identificar el botón que fue.

Esta no es una buena planificación, pero en todo caso me parece un buen ejemplo para hablarles de el tema de custom Events.

El código que aquí presento es únicamente para mostrarles el ejemplo pero NO se los recomiendo ya que tiene distintos problemas de buena programación así como leaks de memoria.

Creemos nuestros menú:

Código :

import flash.display.MovieClip;
import flash.display.Graphics;

var total:uint = 3;

var boton:MovieClip;
var g:Graphics;
for(var i:uint=0;i<total;i++){
   boton = new MovieClip();
   g = boton.graphics;
   g.beginFill(0xFF0000);
   g.drawRect(0, 0, 100, 80);
   g.endFill();
   boton.y = 100;
   boton.x = (i * 110) + 100;
   addChild(boton);
}


En este ejemplo si agregamos un addEventListener al botón no vamos a poder alcanzarle nuestros propios parámetros que de hecho es el indice del botón en el menú siendo 0 el primero.

La solución es crear nuestro propio tipo de MovieClip:

Código :

package {
   
   import flash.display.MovieClip;
   
   public class MiPropioMC extends MovieClip
   {      
      public function MiPropioMC(){ super();
   }
}   
}


Teniendo esto podemos crear instancias de MiPropioMC en vez de un MovieClip pero aun no solucionamos el tema del parámetro en el evento.

Primero hay que crear el evento:

Código :

package
{
   import flash.events.Event;
   import flash.events.MouseEvent;
   
   public class MiPropioEvent extends MouseEvent
   {      
      public static const CLICK:String = "mipropio_click";      
      public var miIndice:uint;
      
      public function MiPropioEvent(type:String, indice:uint /*los demas parámetros no los vamos a utilizar en esta oportunidad*/)
      {
         miIndice = indice;
         super(type);
      }      
      override public function clone():Event
      {
         return new MiPropioEvent(type, miIndice);
      }      
   }   
}


Luego modifiquemos nuestra clase del MovieClip:

Código :

package
{   
   import flash.display.MovieClip;
   import flash.events.MouseEvent;
   
   public class MiPropioMC extends MovieClip
   {
      public var indice:uint;
      
      public function MiPropioMC()
      {
         super();         
         addEventListener(MouseEvent.CLICK, miDispatcher);         
      }      
      private function miDispatcher(e:MouseEvent):void
      {
         dispatchEvent(new MiPropioEvent(MiPropioEvent.CLICK, indice));
      }      
   }   
}


Ya con esto tenemos, ahora nada mas nos queda modificar nuestro menú:

Código :

import flash.display.Graphics;

var total:uint = 3;

var boton:MiPropioMC;
var g:Graphics;
for(var i:uint=0;i<total;i++)
{
   boton = new MiPropioMC();
   g = boton.graphics;
   g.beginFill(0xFF0000);
   g.drawRect(0, 0, 100, 80);
   g.endFill();
   boton.indice = i;
   boton.y = 100;
   boton.x = (i * 110) + 100;
   boton.addEventListener(MiPropioEvent.CLICK, mandaTrace);
   addChild(boton);
}

function mandaTrace(e:MiPropioEvent):void
{
   trace (e.miIndice);
}


Eso es todo.

¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.

Publica tu comentario

o puedes...

¿Estás registrado en Cristalab y quieres
publicar tu URL y avatar?

¿No estás registrado aún pero quieres hacerlo antes de publicar tu comentario?

Registrate