Comunidad de diseño web y desarrollo en internet online

Crear variables dinámicas As3

Citar            
MensajeEscrito el 29 Abr 2010 01:17 pm
Buenos días amigos foristas y moderadores, me veo en la necesidad de escribirles de nuevo ya que no consigo la respuesta de mi problema. La cosa es la siguiente:

Necesito crear variables dinámicas, es decir el nombre de una variable en tiempo de ejecución, ejemplo:
En un for deseo crear 3 variables

Código ActionScript :

var prueba:String="nuevo";

for( var i:uint = 0; i< contenido.length; i++){
    //AQUI DESEO CREAR LA VARIABLE DINAMICA
    var this [prueba + i.toString() ] :String;
    this [prueba + i.toString() ] = "Variable Dinamica Nº " + i.toString();
}
//MOSTRAR SALIDA
trace(nuevo0);
trace(nuevo1);
trace(nuevo2);



He intentado con ese código y muchas otras cosas, lo cierto es que lo he logrado en otros lenguajes, incluyendo actionscript 2.0, pero es posible acaso en actionscript 3.0 ??

Esa es mi pregunta moderadores y foristas, en lo que me puedan ayudar estaré muy agradecido. :)

Por freddydg

16 de clabLevel



 

chrome
Citar            
MensajeEscrito el 29 Abr 2010 03:18 pm
Funciona siempre que te mantengas en notación de array, ejemplo

Código ActionScript :

var prueba:String="nuevo"; 
 
for( var i:uint = 0; i< 3; i++){ 
    //AQUI DESEO CREAR LA VARIABLE DINAMICA 
    this["nuevo" + i] = "Variable Dinamica Nº " + i; 
} 
//MOSTRAR SALIDA 
trace(this["nuevo" + 0]); 
trace(this["nuevo" + 1]); 
trace(this["nuevo" + 2]); 


Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 29 Abr 2010 03:43 pm
Ok muchas gracias, por tan rápida respuesta, sos los mejores :cool:

Por freddydg

16 de clabLevel



 

chrome
Citar            
MensajeEscrito el 29 Abr 2010 04:43 pm
Disculpa de nuevo, pero no me ha funcionado del todo.
Mi idea principal era primero tener el nombre de la variable, y segundo crear un objeto con ese nombre, así:

Código ActionScript :

for( var i:uint = 0; i< contenido.length; i++){
   this["variable"+i]:mi_objeto = new mi_objeto(parametros);
}

y así crear 3 objetos, llamados: variable0, variable1, variable2


Pero al hacer esto, me sale el error 1078: La etiqueta debe ser un identificador sencillo

Por freddydg

16 de clabLevel



 

chrome
Citar            
MensajeEscrito el 29 Abr 2010 04:56 pm
Instanciando clases sería así:

Código ActionScript :

for( var i:uint = 0; i< 3; i++){ 
    //AQUI DESEO CREAR LA VARIABLE DINAMICA 
    this["nuevo" + i] = new Sprite()
} 
//MOSTRAR SALIDA 
trace(this.nuevo0)
trace(this.nuevo1)
trace(this.nuevo2)


Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 29 Abr 2010 05:30 pm
jajajaaj eres el mejor, mis reverencias :lol:

Por freddydg

16 de clabLevel



 

chrome
Citar            
MensajeEscrito el 30 Abr 2010 01:16 am
ok Muy bueno, y muy interesante, pero yo tengo una pregunta un poco mas dificil.

supongamos que aparte de crear el objeto dinamicamente quiero que sea de una clase dinamicamente igual, el codigo seria algo paracido a esto

this["objeto"+i] = new ........ es aqui donde tengo la duda
this["objeto"+i] = new this["clase"+i] ?????? da error??

como podria solucionar algo asi

de antemano mil gracias

Por mxcreativo

3 de clabLevel



 

firefox
Citar            
MensajeEscrito el 30 Abr 2010 09:53 am
Algo así:

var ClassReference:Class = getDefinitionByName("String") as Class;
var miClase:ClassReference = new ClassReference();

Donde String lo formas como quieras, recuerda que si no son clases que están en la biblioteca las tienes que importar

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 11 Dic 2010 04:26 pm
Fantástico!!!!!!!!! Jorge, siempre estuve buscando como hacer lo de asignarle una clase dinamicamente, no suelo escribir mucho en los foros pero en este caso, mereces una súper felicitación y agradecimiento, gracias!!!!

Por mxcreativo

3 de clabLevel



 

chrome
Citar            
MensajeEscrito el 11 Abr 2011 10:13 pm
Buenas, una duda al respecto de esto, ¿cómo se haría dentro de una clase? He intentado con la misma estructura que has comentado Jorge y me dá el siguiente error:

Código :

ReferenceError: Error #1056: No se puede crear la propiedad box1 en PruebaThis.
   at PruebaThis()

Esta sería la clase de prueba que he utilizado:

Código ActionScript :

package  {
   import flash.display.*;
   
   public class PruebaThis extends MovieClip {
   
      public function PruebaThis() {
         
         for (var i:int=1; i<4; i++) {
            this["box"+i]=new MovieClip;
         }
      }   
   }
}


Muchas gracias y un saludo

Por evilactiviti

27 de clabLevel



Genero:Masculino  

msie
Citar            
MensajeEscrito el 12 Abr 2011 01:48 pm
En esta sentencia

this["box"+i]=new MovieClip;

La expresión box+i deberia ser una propiedad existente, a diferencia de AS2, en AS3 no puedes crear propiedades al vuelo (bueno, por lo menos no sin truco) Supongo que lo que quieres es crear un nombre, haz simplemente:

Código ActionScript :

var target:MovieClip;
 for (var i:int=1; i<4; i++) { 
      target = new MovieClip()
      target.name = "box"+i; 
  } 


Luego puedes tener referencia al clip usando getChildByName

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 12 Abr 2011 03:33 pm
Genial Jorge, muy bien.
Y ahora con getChildByName, como puedo acceder a las propiedades, sería algo así?

Código ActionScript :

var target:MovieClip;
 for (var i:int=1; i<4; i++) { 
      target = new MovieClip()
      target.name = "box"+i; 
  }
getChildByName("box1").x=100;
getChildByName("box1").y=200;

Y dentro de un bucle, sería así?

Código ActionScript :

for (var i:int=1; i<4; i++) { 
       getChildByName(this["box"+i]).x=100*i;
       getChildByName(this["box"+i]).y=200;
  }

Estoy un poco desorientado, he leído varios post, y hay algunos con un nivel altísimo, sobre todo para mi comprensión :). Tengo todavía muchas dudas. Los ficheros de ayuda de flash me tienen un poco loco, casi siempre me quedo igual.

Un saludo

Por evilactiviti

27 de clabLevel



Genero:Masculino  

msie
Citar            
MensajeEscrito el 12 Abr 2011 03:37 pm
Sip, pero al compilar te dará un error si no haces un cast

MovieClip(getChildByName(this["box"+i])).x=100*i

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 12 Abr 2011 03:53 pm
Vale, vale..... Cada vez entiendo menos, es necesario hacerle saber que es un MovieClip, aunque se haya declarado antes como MovieClip?
Me acabo de bajar la guía del desarrollador de ActioScript 3, a ver si voy cogiendo conceptos, ahora mismo creo que voy un poco bastante a ciegas.

Un saludo

Por evilactiviti

27 de clabLevel



Genero:Masculino  

msie
Citar            
MensajeEscrito el 12 Abr 2011 04:27 pm
Evilactiviti, si tienes la "propiedad" "name" puedes, siempre que lo hayas AÑADIDO -con un addChild. Si no lo añades no lo encontrará.

Código ActionScript :

getChildByName("box"+i).x=100*i; 

Por cierto, no hace falta ninguna conversión de cast en este caso, puesto que getChildByName (mira la ayuda devuelve un "DisplayObject". Como un displayObject tiene la "propiedad" x, no te hace falta ninguna conversión de cast -decirle que es un MovieClip-

La "conversión de cast" a MovieClip es porque las únicas clases que no son selladas son MovieClip y Object. Eso quiere decir en la práctica que el compìlador da error si escribimos algo como

Código ActionScript :

algo.mivariable=100 //da error si "algo" NO es un MovieClip
mimovieclip.mivariable=100 //no da error porque miclieclip es un MovieClip

cuando usamos un método debemos fijarnos siempre qué es lo que nos devuelve. Así, p.e. getChildByName devuelve siempre algo de tipo DisplayObject, la propiedad "target" es de tipo Objeto, etc.
Si nosotros sabemos que lo que nos devuelve es "algo más" debemos hacer una "conversión de cast" para decirle que es algo más.
Imagina que tenemos un MovieClip cuyo nombre es "mimc"

Código ActionScript :

var do:DisplayObject=getChildByName("mimc")
var mc:MovieClip=getChildByName("mimc") as MovieClip
do.gotoAndPlay(1) //<--da error, puesto que es un displayObject
                //y un displayObject no tiene el método "gotoAndPlay"
mc.gotoAndPlay(1)  //sí funciona
//si lo hacemos en una sola línea 
getChildByName("mimc").gotoAndPlay(1)  //<--da error, puesto que gotoAndPlay NO es
                          //un método de displyObject
MovieClip(getChildByName("mimc")).gotoAndPlay(1) //funciona

Sí, hay dos modos de hacer una "conversión de cast"

Código ActionScript :

(getChildByName("mimc") as MovieClip).gotoAndPlay(1)
//ó
MovieClip(getChildByName("mimc")).gotoAndPlay(1)

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 12 Abr 2011 04:46 pm
Bueno, bueno, bueno, fantástica explicación, de verdad, sólo me ha quedado una duda. Con respecto al penúltimo ejemplo, donde pones:

Código ActionScript :

getChildByName("mimc").gotoAndPlay(1)

mimc, siendo un MovieClip, daría error como displayObject? Aquí es donde me pierdo bastante, y es posible que sea una de mis mayores fuentes de error. Aunque la cosa me va quedando bastante clara. Muchisimas gracias, este post lo pongo en favoritos :D

Por evilactiviti

27 de clabLevel



Genero:Masculino  

msie
Citar            
MensajeEscrito el 18 Abr 2011 10:55 am
Si miras la ayuda (el enlace de la ayuda está más arriba) de getChildByName, verás que "devuelve" un DisplayObject. si miras la ayuda de DisplayObject verás que no tiene ningún "método" que sea gotoAndPlay. Vale, NOSOTROS sabemos que es un MovieClip, pero FLASH no lo sabe. Por eso da error.
Como no lo sabe le tenemos que "ayudar".(le tenemos que decir que es un MovieClip). NOTA: si no fuera un MovieClip y nosotros le indicamos que sí lo es, nos daría un error "en tiempo de ejecución".

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 21 Abr 2011 09:01 am
Perdón por la tardanza. Muchisimas gracias otra vez, ahora sí que tengo claras muchas cosas.
Un saludo.

Por evilactiviti

27 de clabLevel



Genero:Masculino  

msie

 

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