Botones con parámetros en Actionscript 3
Este es un código de ejemplo muy sencillo de cómo asignar funciones con parámetros a botones dinámicamente con un bucle for();
Este era un recurso muy utilizado en Actionscript 2 cuando teníamos varios botones con nombres con una secuencia numérica (ej: boton1, boton2, boton3 etc..)
{
this["boton" + i].num = i;
this["boton" + i].onRelease = function()
{
trace("Soy el botón " + this.num);
};
}
Hacíamos un típico scope colocando el parámetro (en este caso la variable "num") dentro del objeto botón, y luego el la función que ejecuta el evento onRelease (o el que sea). De esta manera con un this podíamos recuperar ese parámetro y con un if() o un switch() ejecutabamos las funciones correspondientes a cada botón.
En Actionscript 3 no podemos asignar directamente el parámetro al botón ya que nos lanzaría un error:
¿Cómo podemos hacerlo ahora?
Una solución rápida es recuperar el valor númerico del botón a partir del nombre del clip:
{
this["boton" + i].addEventListener(MouseEvent.MOUSE_UP,clicBoton);
}
function clicBoton(e:MouseEvent)
{
var nombre:String = e.currentTarget.name;
var num:uint = uint(nombre.replace("boton", ""));
trace("Soy el botón " + num);
}
Únicamente recuperamos el nombre del botó clicado y eliminamos el String "boton" con lo que nos queda el numero correspondiente.
Otro opción algo más laboriosa pero que nos permite más control de los parámetros en códigos más complejos sería crearnos una clase que extienda de simpleButton que permita lanzar listeners con parámetros.
{
import flash.events.EventDispatcher;
import flash.events.MouseEvent;
import flash.display.SimpleButton;
//-------------------------------------------------
public class BotonScope extends SimpleButton
{
private var _boton:SimpleButton;
private var _param:Object;
private var _listener:Function;
//-------------------------------------------------
public function BotonScope(b:SimpleButton,p:Object)
{
_boton=b;
_param=p;
}
//-------------------------------------------------
override public function addEventListener(type:String,
listener:Function,
useCapture:Boolean = false,
priority:int = 0,
useWeakReference:Boolean = false):void
{
_listener = listener
_boton.addEventListener(type,listenerParam,useCapture,
priority,useWeakReference);
}
private function listenerParam(e:MouseEvent)
{
_listener(e,_param);
}
//-------------------------------------------------
}
}
Esta clase simplemente extiende de simpleButton y recibe como parámetro el objeto simpleButton que tengamos colocado en el timeline y también incluiremos un objeto que contendrá los parámetros que nos interesen.
Sobrescribiremos con override la function addEventListener. Lo que haremos es que el listenr ejecute la función interna de la clase que en realidad lo unico que hace es ejecutar la función asignada desde el timelime pero pasandole el objeto con los parámetros:
Desde el timeline asignaremos los listeners de esta manera:
for (var i:Number = 1; i <= 5; i++)
{
var param:Object = new Object();
param.num = i;
var boton:BotonScope = new BotonScope(this["boton" + i],param);
boton.addEventListener(MouseEvent.MOUSE_UP,clicBoton);
}
function clicBoton(e:MouseEvent,param:Object)
{
trace("Soy el botón " + param.num);
}
Creamos el objeto con los parámetros y lo incluimos dentro del constructor del botón. De esta manera las funciones asignadas al listener recuperarán el objeto con los parámetros internos de cada botón.
Post relacinonados:




November 30th, 1999 at 12:00 am
Muy útil Z, sobre todo cuando estás tratando de encariñarte con AS3 ^^
November 30th, 1999 at 12:00 am
Excelente!, no me sabÃa eso de pasar funciones como parámetros
! En verdad creo que me va a servir
.
November 30th, 1999 at 12:00 am
También es posible extender a SimpleButton con una clase dinámica obteniendo prácticamente el mismo caso que en AS2.
August 22nd, 2008 at 6:25 pm
hola.....
he nesecitado ayuda para crear botones en AS3, y que cada uno de estos cumpla una funcion, como transparencia, rotacion, escala.....
juanmaz28@hotmail.com
October 21st, 2008 at 10:19 am
Epa como esta quisiera saber si me pueden ayudar con lo codigos para botones en AS3 porque estoy un poquito vuelto loco con eso.
Me porian ayudar por favor
October 21st, 2008 at 10:28 am
@devt16: Pásate por los foros de AS3 de Cristalab, y ahí dejas las dudas que tengas, seguro que te podremos ayudar
http://www.cristalab.com/foros/viewforum.php?f=40
November 29th, 2008 at 9:44 am
buenísimo!!!
muchas gracias!!
January 18th, 2010 at 6:42 pm
Hola, me ando haciendo una bola con esto del AS3, mi problema es el siguiente, y me gusatria muchoq ue me ayuden. tengo un nuevo trabajo y mi estadia en el depende de esto! estoy haciendo un CD interactivo, hice un movieclip y dentro de este movieclip lo hice boton, parq ue el boton tuviera animacion y luego al quedar estatico me diera donde pinchar, pero no encuentro el codigo correcto para hacerlo porque me tira un error. dando vuleta en la web me encontre que ya no se pueden usar los codigos AS2 y los Codigos AS3 que me he encontrado no me resuelven el problema... por favor alguien asesoreme!!! :S