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..)
- for (var i:Number = 1; i <= 5; i++)
- {
- this["boton" + i].num = i;
- this["boton" + i].onRelease = function()
- {
- trace("Soy el botón " + this.num);
- };
- }[/as]</div>
- Hacíamos un típico <strong>scope </strong>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 <strong>onRelease </strong>(o el que sea). De esta manera con un <strong>this </strong>podíamos recuperar ese parámetro y con un <strong>if()</strong> o un <strong>switch()</strong> 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:
- <div id=codigo>ReferenceError: Error #1056: No se puede crear la propiedad num en flash.display.SimpleButton.</div>
- ¿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:
- <div id=codigo>[as]for (var i:Number = 1; i <= 5; i++)
- {
- 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);
- }[/as]</div>
- Ú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 <strong>simpleButton </strong>que permita lanzar <strong>listeners </strong>con parámetros.
- <div id=codigo>[as]package
- {
- 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:
- _listener(e,_param);
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); }[/as]
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.
Compártelo:
Visto 36.184 veces
Muy útil Z, sobre todo cuando estás tratando de encariñarte con AS3 ^^
Excelente!, no me sabÃa eso de pasar funciones como parámetros :D! En verdad creo que me va a servir ;).
También es posible extender a SimpleButton con una clase dinámica obteniendo prácticamente el mismo caso que en AS2.
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
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
@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
buenísimo!!!
muchas gracias!!
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
Hola Buenas, lo primero comentar que soy nuevo en este mundo y estoy aprendiendo un poquito de flash para una aplicación que tengo que entregar a un profesor. Mi pregunta es cómo crear un botón (todo mediante código) dentro de una clase de una aplicación que ya me funciona, para que el botón se vea y al pulsarlo me ejecute un archivo .swf externo. Muchas gracias y cualquier idea me sería muy muy útil.
Saludos y agradecer de antemano a todos los que colaboran en este foro.