Comunidad de diseño web y desarrollo en internet online

Referencias getChild y DisplayObject

Citar            
MensajeEscrito el 17 Sep 2010 07:25 am
Holaaaa!!
Bueno gente, estaba probando cosas en AS3. Entre ellas estaba intentando hacer una que no me ha salido. La explico y a ver si me podéis echar una mano.
Resulta que tengo siete imagenes cargadas cada una en un Loader distintos a los que he llamada imagen0, imagen1, ..., imagen6. Luego tengo dos contenedores (tipo Sprite) donde quiero cargar las imagenes de forma dinámica, es decir, dependiendo de los valores de dos variables cargaré una imagen determinada en uno de los dos contenedores.
El problema lo estoy teniendo en las conversiones de cast (creo).
Si yo, directamente, le digo:

Código ActionScript :

contenedor0.addChild(imagen0);

me funciona sin problema.
Si yo hago referencia a un contenedor con el metodo getChildByName tambien me funciona, por ejemplo

Código ActionScript :

var mov:Tween = new Tween(getChildByName("contenedor" + num_contenedor), "x", Strong.esaeIn, 0, -1500, 2, true)

Pero si lo que quiero es hacer referencia a que cargue una imagen me da fallo, pero si intento otras cosas no lo hace:

Código ActionScript :

//La siguiente sentencia falla;
getChildByName.("contenedor" + num_contenedor).addChild(imagen2);

//La siguiente sentencia NO falla
getChildByName.("contenedor" + num_contenedor).x = 0;

Por otro lado tampoco me deja hacer referencia dentro del .addChild(...) a un elemento Loader mediante el comando getChild, supongo que porque lo que me devuelve es un MovieClip y no lo puede convertir en Loader.

En conclusión, me gustaría poner una sentencia del tipo

Código ActionScript :

getChildByName("contenedor" + num_contenedor).addChild(getChildByName("imagen" + num_imagen));

y que funcionase sin problemas.
¿En que me estoy equivocando?
Si necesitáis el código completo decídmelo y lo pongo.
Muchas gracias!!!

Por SeiyaJapon

54 de clabLevel



 

España

safari
Citar            
MensajeEscrito el 17 Sep 2010 03:43 pm
¿Quieres hacer referencia a un Loader dentro de un clip? ¿A un clip dentro de otro clip?

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 17 Sep 2010 03:44 pm
Como tu lo dijiste el problema es el casting, sabes que contenedor es un sprite asi quehaces un casting a Sprite:

Código ActionScript :

Sprite(getChildByName.("contenedor" + num_contenedor)).addChild(imagen2);



Saludos!!

Por Angel Roberto

Claber

248 de clabLevel



 

firefox
Citar            
MensajeEscrito el 20 Sep 2010 07:42 am
Primero: Muchas gracias por responder tan pronto XD.
Ahora, a Angel Roberto:
Lo que me has puesto funciona. Pero quiero ir un paso mas allá. Ahora lo explico.
A Jorge:
Lo que tengo son dos contenedores de tipo Sprite:

Código ActionScript :

var contenedor0:Sprite = new Sprite();
var contenedor1:Sprite = new Sprite();


y tengo 7 imagenes metidas en Loaders:

Código ActionScript :

var imagen0:Loader = new Loader();
imagen0.load(new URLRequest("http://www.mipagina.com/varios/banner_principal/balneario.jpg"));
var imagen1:Loader = new Loader();
imagen1.load(new URLRequest("http://www.mipagina.com/varios/banner_principal/cama.jpg"));
//...
imagen5.load(new URLRequest("http://www.mipagina.com/varios/banner_principal/hall.jpg"));
var imagen6:Loader = new Loader();
imagen6.load(new URLRequest("http://www.mipagina.com/varios/banner_principal/piscina.jpg"));


Lo que quiero es ir cambiando las imagenes que contienen los contenedores, ya que quiero ir pasandolos como si se tratara de unos cromos (la idea dicha así debe de ser complicada de entender).
Básicamente lo que quiero es eso, que se vayan cambiando las imagenes que tengo dentro de los contenedores.
Como he dicho antes, la idea de Angel Roberto funciona, pero exactamente lo que yo pretendería que funcionara sería esto:

Código ActionScript :

Sprite(getChildByName("contenedor" + num_contenedor)).addChild(getChildByName("contenedor" + num_imagen));


pero me da un fallo, ya que para Flash " El valor del parámetro child debe ser distinto de null" y eso es porque el contenido que hay dentro del ".addChild" no lo reconoce como un DisplayObject valido. Supongo que porque lo que cargo no es un MovieClip, sino un Loader. Pero si yo coloco directamente el nombre del Loader SI que me lo admite. Eso me hace pensar que hace un cast convert automaticamente ¿me equivoco?.
Por lo tanto lo que yo tengo que poner para que funcione es una conversion de cast manual (que sea correcta, porque las que he probado no han funcionado) o una sentencia que sea correcta (lo que significaría que lo que he escrito no lo es).
Bueno, espero haberme explicado correctamente.
Si hace falta que exlique algo mas o que lo explique de otra manera, decídmelo y lo haré encantado.
Muchas gracias por vuestra ayuda!

Por SeiyaJapon

54 de clabLevel



 

España

firefox
Citar            
MensajeEscrito el 20 Sep 2010 07:54 am
P.D:
Por cierto, ya se que en

Código ActionScript :

Sprite(getChildByName("contenedor" + num_contenedor)).addChild(getChildByName("contenedor" + num_imagen)); 


pone "contenedor" en el addChild, pero es que se me he equivocado al escribirlo en el foro. En el código esta bien.
Gracias!

Por SeiyaJapon

54 de clabLevel



 

España

firefox
Citar            
MensajeEscrito el 20 Sep 2010 08:43 am
BuenAS:

No te voy a dar la solución, pero sí un método para "acotar" el problema: en vez de ir a tiro hecho, prueba:

Código ActionScript :

var sprite:Sprite = this.getChildByName("contenedor" + num_contenedor) as Sprite;
var child:DisplayObject =  this.getChildByName("contenedor" + num_imagen) as DisplayObject;
sprite.addChild( child); 


crea un pto de ruptura y comprueba si realmente sprite toma un valor distinto de null y de qué tipo es; haz lo mismo con child. Posiblemente descubras cuál de los dos está fallando, o si fallan los dos.

Cuando "acotes" el problema, por ejemplo, (me lo estoy inventando) que has escrito mal "num_imagen" y que child no obtiene "contenedor" + num_imagen, lo solucionas, y vuelves a formar la expresión sin estas variables intermedias.

Un saludo.

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 20 Sep 2010 10:08 am
Hola Lukánicos!
Veras, he probado a acotar como me has recomendado, pero en lugar de poner exactamente lo que me has dicho, he puesto esto:

Código ActionScript :

var sprite:Sprite = this.getChildByName("contenedor" + num_contenedor) as Sprite; 
var child:DisplayObject =  this.getChildByName("imagen" + num_imagen) as DisplayObject; 
sprite.addChild( child);


Lo he hecho así por dos motivos. El primero es que un objeto no se puede contener a sí mismo. Ademas lo que me interesa es que el objeto contenedor contenga una de las imagenes.
La conclusión ha sido la misma que cuando he intentado realizar la conversión de cast de modo manual. Flash entiende que al Loader de la imagen (lo que es en el código de Lukánicos "child") se le carga un objeto nulo.
De todos modos muchas gracias!
Se que el problema lo podría resolver con un switch, pero si con una sentencia me puedo ahorrar una secuencia de control creo que quedaría mas limpio y profesional.
A ve si a alguien se nos ocurre algo.
Mucha gracias!!

Por SeiyaJapon

54 de clabLevel



 

España

firefox
Citar            
MensajeEscrito el 21 Sep 2010 02:11 am
Si trazaras el nombre de uno de tus loaders verias que no coincide con el nombre de la variable si haces:

Código ActionScript :

var imagen1:Loader = new Loader();
trace(imagen1.name);
//Trazaria algo como instance1 o algun nombre similar


Asignales un nombre:

Código ActionScript :

var imagen1:Loader = new Loader();
imagen1.name = "imagen1";
trace(imagen1.name);
//Con eso ya coinciden


Yo en tu caso me despreocupaba del getChildByName simplemente le removia todas las imagenes al contenedor (de nada sirve que esten enciimadas y agregaba la nueva haciendo referencia como tu lo haces pero al nombre de la variable no ala propiedad nombre.

Código ActionScript :

contenedor.addChild( this["imagen1"]);


Con la sintaxis de arriba haces alusion al nombre de variable asi que no necesitas modificar la propiedad name.

Saludos!!

Por Angel Roberto

Claber

248 de clabLevel



 

firefox
Citar            
MensajeEscrito el 21 Sep 2010 11:08 am
No se me habia ocurrido para nada hacer referencia de ese modo a las imagenes para cargarlas.
Me ha gustado la idea, si señor.
Un 10 para Angel Roberto!
^^

Por SeiyaJapon

54 de clabLevel



 

España

firefox

 

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