Comunidad de diseño web y desarrollo en internet online

Llamar objetos cuyo nombre se ha generado de forma dinámica

Citar            
MensajeEscrito el 14 Ene 2010 06:22 pm
Tengo una función que me trae a pantalla 4 elementos.

Código ActionScript :

function loop(e:MouseEvent){ 
   for(var i:uint=0; i<4; i++){   
      triangulo= new Avance();
      triangulo.x=60;
      triangulo.y=145+(i*60);
      triangulo.buttonMode=true;
      triangulo.name= "triangulo_"+i;
      this.getChildByName("triangulo_"+i).addEventListener(MouseEvent.CLICK,mover_1)       
      contenedor.addChild(triangulo);
   }
}


Los nombre para cada objeto son:

Código ActionScript :

triangulo_0, triangulo_1, triangulo_4, triangulo_3


La función mover_1 es:

Código ActionScript :

function mover_1(e:MouseEvent){
   if(indice == 0){
      anima=new GTween(getChildByName("triangulo_0"),2,{x:getChildByName("triangulo_0").x+400},{ease:Back.easeOut})   
      movido=true;      
      indice++;
      trace(movido);
   }
   else if(movido){
      anima=new GTween(getChildByName("triangulo_0"),2,{x:getChildByName("triangulo_0").x-400},{ease:Back.easeOut})   
      movido=false;      
   }   
   else {
      anima=new GTween(getChildByName("triangulo_0"),.3,{x:getChildByName("triangulo_0").x+400},{ease:Back.easeIn})      
      movido=true;   
   }


No logro que se mueva ningún triangulo, porque no puedo aplicarle el efecto tweener, ¿cómo podría referenciar a cada instancia creada para aplicarle el efecto?

}

Por tementa

33 de clabLevel



 

firefox
Citar            
MensajeEscrito el 14 Ene 2010 06:34 pm
ahh y por que usas getChildByName , en el click handler de los triangulos, cuando la referencia de estos esta guardada en el parametro event object 'e' , en todo caso has una comparacion entre el target.name y el nombre que le asignaste al triangulo, o una conversion de cast.


Jonathan.

Por maneuver

243 de clabLevel



Genero:Masculino  

Mexico City

firefox
Citar            
MensajeEscrito el 15 Ene 2010 01:06 pm
Tres cosas
1.-En tu función loop no hace falta que uses getchildByName, puedes escribir directamente

Código ActionScript :

triangulo.addEventListener(MouseEvent.CLICK,mover_1)

2.-Tus triángulos están DENTRO de "contenedor", así que, para buscarlos debería ser

Código ActionScript :

contenedor.getChildByName("triangulo_0")

3.-Normalmente se suele guardar en un array los MCs a mover, p.e.

Código ActionScript :

misTriangulos:Array=new Array() //<--declaramos aquí una variable
//en tu función loop
function loop(e:MouseEvent){  
   for(var i:uint=0; i<4; i++){    
      misTriangulos[i]= new Avance(); 
      misTriangulos[i].x=60; 
      misTriangulos[i].y=145+(i*60); 
      misTriangulos[i].buttonMode=true; 
      misTriangulos[i].name= "triangulo_"+i; 
      misTriangulos[i].addEventListener(MouseEvent.CLICK,mover_1)        
      contenedor.addChild(misTriangulos[i]); 
   } 
}
//ahora podemos referirnos a triangulo_0 como
misTriangulos[0]
//ó como estás haciendo
contenedor.getChildByName("triangulo_0")

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 25 Ene 2010 12:55 pm
He empleado el siguiente código:

Código ActionScript :

var misTriangulos:Array=new Array() //<--declaramos aquí una variable 

//en tu función loop 
function loop(e:MouseEvent){   
   for(var i:uint=0; i<4; i++){     
      misTriangulos[i]= new Avance();  
      misTriangulos[i].x=60;  
      misTriangulos[i].y=145+(i*60);  
      misTriangulos[i].buttonMode=true;  
      misTriangulos[i].name= "triangulo_"+i;  
      misTriangulos[i].addEventListener(MouseEvent.CLICK,mover_1);       
      contenedor.addChild(misTriangulos[i]);  
   }  
} 
//ahora podemos referirnos a triangulo_0 como 
misTriangulos[0].addEventListener(MouseEvent.CLICK, decir);

function decir(e:MouseEvent){
   trace("Hi");
}


Mostrándome los siguientes errores:

Código ActionScript :

TypeError: Error #1010: A term is undefined and has no properties.
   at ms_Tweeners_fla::MainTimeline/frame1()
TypeError: Error #1009: Cannot access a property or method of a null object reference.
   at ms_Tweeners_fla::MainTimeline/mover_1()



Es como si fuera de la función loop no reconociese el nombre que se le asigna a los objetos traídos a escena.

Por tementa

33 de clabLevel



 

firefox
Citar            
MensajeEscrito el 25 Ene 2010 01:06 pm
Entiendo que "Avance" es un mc de la biblioteca... entonces prueba esto:

Código ActionScript :

var ClassReference:Class = getDefinitionByName("Avance") as Class;
function loop(e:MouseEvent){  
   for(var i:uint=0; i<4; i++){ 
      this["triangulo"+i] = new ClassReference();
      contenedor.addChild(DisplayObject(this["triangulo"+i]));
      var clip:Object = this["triangulo"+i];
      clip.x=60; 
      clip.y=145+(i*60); 
      clip.buttonMode=true;
      clip.name = "triangulo"+i;
      clip.addEventListener(MouseEvent.CLICK,mover_1);
}

Por juanfher

74 de clabLevel



 

firefox
Citar            
MensajeEscrito el 25 Ene 2010 03:01 pm
Tementa, te estaba poniendo un ejemplo y las "partes significativas". Cunado dije que puedes poner

Código ActionScript :

misTriangulos[0].addEventListener(MouseEvent.CLICK, decir); 

Me refería a que, una vez llamada a la función loop, dentro de cualquier función puedes usar el array "misTriangulos". Así misTriangulos[0] sería el primer triángulo creado. (si lo pones antes de llamar a la función te dará un error porque todavía no tiene ningún valor)
Juanfer, en este caso no creo que tenga que ver con tener distintas Clases (símbolos) en la biblioteca, sino que todos los MCs son objetos de la misma Clase.

Por Eliseo2

710 de clabLevel



 

firefox

 

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