Cristalab

                 ¿Quieres registrarte?

Botones con parámetros en Actionscript 3

Por: Zguillez
18 de Abril del 2008
6416 de clabLevel
Otros artículos de Zguillez
13,550 visitas

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);


Artículos Relacionados


Etiquetas actionscript_3

Comentarios | Enviar un comentario
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 U_U. :D
Por: Rafeo
está muy bueno (Y)

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... U_U 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. :cry: :cry: :cry:
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
Deja un comentario
IMPORTANTE

Recuerda ser respetuoso, no insultes a otras personas, ni uses palabrotas, hay una persona al otro lado de la pantalla.

Habla bien, NO ESCRIBAS EN MAYUSCULA TODO, no escribas como en un SMS, evita cosas como "ke", "x q" y demás abreviaciones.

Aquí funcionan las etiquetas de los foros, puedes usar [b] para negrita, [img] para las imágenes, [url] para los enlaces, etc.

Si tienes preguntas técnicas, envíalas mejor al foro.