Comunidad de diseño web y desarrollo en internet online

variables "dinamicas" y onPress

Citar            
MensajeEscrito el 10 Jul 2009 12:12 am
:oops: hola

Tengo un problema que me esta desesperando hasta niveles desconocidos
la idea es que tengo 3 botones generados dinamicamente por medio de un for (con attachMovie)
Para las funciones de OnRollOver y onRollOut no hay el minimo problema, pero cuando trato de aplicar el mismo concepto en onPress es cuando de plano hace lo que le viene en gana

en si, la parte de los botones seria esta:

Código ActionScript :

for(i=0;i<3;i++){
_root["btn"+(i+1)].onRollOver = function () {
...
}

_root["btn"+(i+1)].onRollOut = function () {
...
}

_root["btn"+(i+1)].onPress = function () {
   trace(_root.arrTrace[i]);
}
}


el problema es que el trace siempre me manda el ultimo valor del arreglo (arrTrace) y no valores consecuentes como debiera

hize un experimento en un proyecto nuevo con solo este codigo y va perfecto, pero al momento de mezclarlo con mi proyecto actual hace lo mismo (pone el ultimo valor al presionar el boton)

Código ActionScript :

for(i=0;i<3;i++){
   this["test"+i] = "hola"+i
}
for(i=0;i<3;i++){
   temp = eval("test"+i);
   trace(temp);
}


ojala alguien entienda mi duda y tenga alguna idea de como solucionarla

grasias de hantebrazo T_T

Por tribak

Claber

2448 de clabLevel

6 tutoriales

Genero:Masculino   Héroes

Fotógrafo o algo

firefox
Citar            
MensajeEscrito el 10 Jul 2009 08:07 am
Hola,
yo para asignar eventos a varios botones en un for, siempre uso el truco de la función que simula un Delegate con parámetros, y te aseguro que nunca da ningún problema:

Código ActionScript :

var arrTrace:Array = [1, 2, 3];

for(var i:Number = 0; i < 3; i++) {
   _root["btn" + (i+1)].onRollOver = ParamDelegate(this, rollOverHandler, i);
   _root["btn" + (i+1)].onRollOut = ParamDelegate(this, rollOutHandler, i);
   _root["btn" + (i+1)].onPress = ParamDelegate(this, pressHandler, i);
}

function rollOverHandler(i:Number):Void {
   trace("RollOver: " + _root.arrTrace[i]); 
}

function rollOutHandler(i:Number):Void {
   trace("RollOut: " + _root.arrTrace[i]); 
}

function pressHandler(i:Number):Void {
   trace("Press: " + _root.arrTrace[i]); 
}

function ParamDelegate(o:Object, f:Function):Function{
   var args:Array = arguments.slice(2);
   var func:Function = function():Void {
      var newArgs:Array = arguments.concat(args);
      f.apply(o, newArgs);
   }
   return func;
}

Por isidoro

Claber

498 de clabLevel

2 tutoriales

Genero:Masculino  

firefox
Citar            
MensajeEscrito el 10 Jul 2009 06:27 pm
:o WOW
te agradesco (infinita+1)mente
intentare aplicarlo a mi codigo a ver si no hago otra tonteria :cry: , graciaaas!

Por tribak

Claber

2448 de clabLevel

6 tutoriales

Genero:Masculino   Héroes

Fotógrafo o algo

firefox
Citar            
MensajeEscrito el 10 Jul 2009 10:43 pm
tribak eres el mejor!!!!!

Por el davo29

253 de clabLevel



Genero:Masculino  

Chihuahua :D!

msie8
Citar            
MensajeEscrito el 11 Jul 2009 08:24 am

tribak escribió:

:o WOW
te agradesco (infinita+1)mente
intentare aplicarlo a mi codigo a ver si no hago otra tonteria :cry: , graciaaas!

No me des las gracias a mí, que la función no es mía. La encontré en otra página hace tiempo. Yo incluso he hecho una clase para ella, y la uso siempre en lugar de Delegate (viene muy bien para hacer "botoneras" y pasarle parámetros a sus eventos onPress):

Código ActionScript :

class ParamDelegate {
   public static function create(o:Object, f:Function):Function {
      var args:Array = arguments.slice(2);
      var func:Function = function():Void {
         var newArgs:Array = arguments.concat(args);
         f.apply(o, newArgs);
      }
      return func;
   }
}

Se usa igual que Delegate, pero podemos pasarle los parámetros que queramos, y además el código queda muy ordenado (usando tu ejemplo, un poco modificado):

Código ActionScript :

import ParamDelegate;

var arrTrace:Array = [1, 2, 3];
var butArray:Array = new Array(); //Array de botones

for(var i:Number = 0; i < 3; i++) {
   var aux_mc:MovieClip = this.attachMovie("button", "button" + i, this.getNextHighestDepth());
   aux_mc._x = 100 * i;
   aux_mc._y = 100 * i;
   aux_mc.onRollOver = ParamDelegate.create(this, rollOverHandler, i);
   aux_mc.onRollOut = ParamDelegate.create(this, rollOutHandler, i);
   aux_mc.onPress = ParamDelegate.create(this, pressHandler, i);
   butArray.push(aux_mc);
}

function rollOverHandler(i:Number):Void {
   trace("RollOver: " + _root.arrTrace[i]);
}

function rollOutHandler(i:Number):Void {
   trace("RollOut: " + _root.arrTrace[i]);
}

function pressHandler(i:Number):Void {
   trace("Press: " + _root.arrTrace[i]);
}

Por isidoro

Claber

498 de clabLevel

2 tutoriales

Genero:Masculino  

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.