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(); en Actionscript 3.
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..)
Código :
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);
};
}
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ódigo :
ReferenceError: Error #1056: No se puede crear la propiedad num en flash.display.SimpleButton.
¿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:
Código :
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);
}
Únicamente recuperamos el nombre del botó clicado y eliminamos el String "boton" con lo que nos queda el numero correspondiente.
Otra 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.
Código :
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:
Código :
_listener(e,_param);
Desde el timeline asignaremos los listeners de esta manera:
Código :
import BotonScope;
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.
Código :
function clicBoton(e:MouseEvent,param:Object)
Haciéndolo de esta manera en cualquier momento podríamos tener acceso a los parámetros en el caso de crearnos unas funciones setter y getter para la propiedad, de manera que también podríamos acceder a ella desde la función del listener de esta manera:
Código :
trace("Soy el botón " + e.currentTarget.param.num);
O... digo yo... podrías crear la clase BotonScope de tipo dynamic public class y hacerlo a lo AS2. No es tan elegante como tu opción eso sí. La mia es más para esos casos de urgencia. Por:Freddie
Órale, no cabe duda que vale más maña que fuerza... mañoso . Por:Rafeo
está muy bueno
lo q yo hago aveces por la premura, es meter el i en tabIndex, todo vale en el amor y guarda el i Por:eldervaz
Wow!! Y yo que pensaba que no necesitaba aprender AS3 porque lo único que hago normalmente son eventos de ratón para botoncitos. Se me acaban los argumentos... Muchas gracias!! Por:Carmen
Me parece muy ingenioso y muy útil, sin embargo, extraño la vieja manera del actionscript 2 donde se podían pasar "n" cantidad de parámetros. Por:Shedo
Si creamos una clase Boton que extienda la clase SimpleButton con una propiedad pública que sea params, tendríamos lo mismo con menos esfuerzo. Si queremos ser más puristas podemos definir la clase Boton como
Código :
package {
import flash.display.*;
public class Boton extends SimpleButton {
public var _param:Object;
function Boton(){
}
public function set param(datos:Object){
_param=new Object();
for (var i:String in datos){
_param[i]=datos[i];
}
}
public function get param(){
return _param
}
}
}
Código :
for (i = 0; i < 5; i++)
{
var boton:Boton = new Boton()
boton.param={num:i}
boton.x+=100*i
bton.addEventListener(MouseEvent.MOUSE_UP,clicBoton);
addChild(boton)
}
function clicBoton(e:MouseEvent){
trace("soy "+e.target.param.num)
}
Por:Eliseo-blog
Otro "tip", si definimos una clase como "dynamic" ya podemos hacer todo lo que hacíamos antes.
Código :
package {
import flash.display.*;
public dynamic class Boton extends SimpleButton {
function Boton(){
}
}
Ahora
[code]
for (i = 0; i < 5; i++)
{
var boton:Boton = new Boton()
boton.index=i;
boton.x+=100*i
boton.addEventListener(MouseEvent.MOUSE_UP,clicBoton);
addChild(boton)
}
function clicBoton(e:MouseEvent){
trace("soy "+e.target.index)
} Por:Eliseo-blog
me parece mas complicado, hay algun motivo porque no seguir usando ac2? Por:martin valero-blog
martin valero-blog :
me parece mas complicado, hay algun motivo porque no seguir usando ac2?
Algunas de sus limitaciones, entre ellas la velocidad de ejecucion del mismo Script... Ademas de que ha quedado en el pasado ! Lo mejor es que busques adecuarte al AS3 lo antes posible (creeme, no es tan dificil como crees); ya que es cuestion de tiempo para que Adobe invente algo asi como AS4... El cual te sera aun mas dificil de comprender... Por:M@U
No se.... pero ami no me a funcionando ninguno de los ejemplos... todo eso para un boton? el flash se va a ir a la ..... q frikada mas friki de AS3 Por:un maikel-blog
que ORROR de AS3, Han fusilado a la creatividad multimedia, se acabo ahcer lo que tienes en la mente perdiendo horas y horas en un lenguage de frikys gordos y pedantes..... es un dia de luto recemossssss ameeen Por:un maikel-blog
Pero es 10 veces mas codigo!!
Que porquería lo de AS3. Por:ed-blog
yo me kedo con as2, k porkeria de as3 ,no tengo tanto tiempo para ponerme a editar un codigo de una cuartilla para un simple boton .no pork sepas utilizar as3 vaz a tener un mehor trabajo lo puedes hacer lo mismo con as2 y menos presion Por:ZeaNDigital-blog
nunca voy a poder aprender as3... Por:chabat-blog
nada que hacer va tocar que los programadores "diseñen" y muy entre comillas las web a punta de as3 yo me quedare con el as2 hasta que caiga en el olvido es casi imposible crear un simle menu creo que un programa de diseño es para eso diseñar sin que creen flash para programdores y sale.
que lastiam adobe a ver lelvado este programa a esto Por:juanzear
excelente tutorial, pero deberian dejar un ejemplo de lo que suben al foro.....
suerte Por:pharisss
Estuve por reloj 4 horas tratando de resolver algo similar, suerte que me topé con esto... Gracias Totales.... Por:matias-blog
9+96+9 Por:55-blog
Hola Zguillez,
Soy otro "perdido" más en esto de migrar AS2 a AS3. Es que casi empezaba a entender AS2 cuando... en fin. Mi pregunta talvez sea un poco tonta, pero no entendí si el código va en una instancia del botón, o en algun frame de la línea de tiempo.
Desde ya gracias !!! Por:CRD
@CRD, en AS3 el código no se puede situar encima de las intancias. El código que tiene package al inicio es para hacer una clase extendida de SimpleButton, el otro código es para utilizar en el frame o en la document class del proyecto. Por:elchininet