Comunidad de diseño web y desarrollo en internet online

Rutas y displaylist

Citar            
MensajeEscrito el 10 Sep 2009 10:05 pm
En primer lugar, disculpas si a alguno se le ponen los pelos de punta por las "barbaridades" tecnicas que pueda decir :P

Mi problema esta, en que no me aclaro con las rutas al instanciar dinamicamente un MC de la biblioteca con AS3.

Se que lo adecuado para hacerlo es getChildAt y que segun Mr. Moock: "esta 'muy feo' usar name para hacer referencia a un miembro de la displaylist".

Digamos que tengo esta estructura:

[img]http://l4c.me/fotos/Biktor/esquemadisplay[/img]

Como puedo hacer para "alcanzar" MovieClip F desde MovieClip E

En algunos caso he realizado un cast y subido niveles:

Código ActionScript :

Shape(parent.getChildAt(0)).graphics.lineTo(x,y);


Pero como hago para subir niveles y luego bajarlos.
De nuevo, perdon por la empanada mental.

Gracias

Por Biktor

13 de clabLevel



 

firefox
Citar            
MensajeEscrito el 12 Sep 2009 01:43 am
No tienes que disculparte solo preguntar claramente. ¿Subir?

parent.parent

¿Bajar?

Instancia1.instancia2.etc

Flash publica exportando los nombres de instancia automáticamente, es decir puedes accederlo por nombre de instancia. La postura de Moock dejala entre paréntesis mientras experimentas, ya tendrás tiempo de retomarla

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 14 Sep 2009 08:54 pm
Gracias por tu respuesta Solisarg.

El problema esta cuando lo intento desde una clase.
Por ejemplo, si intento:

trace(MovieClip(parent.parent.parent).instance3);

El error:

ReferenceError: Error #1069: No se encontró la propiedad instance3 en Juego_HU y no hay ningún valor predeterminado.
at Coche/moverCoche()
at Coche/movimientoCoche()
at flash.utils::Timer/_timerDispatch()
at flash.utils::Timer/tick()

Sin embargo, si le doy una propiedad ".name", funciona:

trace(MovieClip(parent.parent.parent).circuito);

De nuevo, gracias.

Por Biktor

13 de clabLevel



 

firefox
Citar            
MensajeEscrito el 15 Sep 2009 06:41 am

Biktor escribió:

Sin embargo, si le doy una propiedad ".name", funciona

NO debería ser así. La propiedad "name", en principio, sólo sirve para usar el método getChildByName

Código ActionScript :

parent.parent.parent.getChildByName("circuito")


Lo que supongo que haces es darle "nombre de instancia" (que es distinto a la propiedad name). En Flash, cuando damos nombre de instancia a un MC (*), lo que hace es declarar una variable con ese mismo nombre que hace referencia a dicho MC. Pero la "propiedad name" NO es el nombre de instancia.

Vale, eso no nos debería sonar extraño. Ya en AS2 escribíamos, p.e.

Código :

//si tenemos un MC con nombre de instancia "mimc"
var variable_ref=mimc
//variable_ref es una "variable", el nombre de instancia es "mimc", por eso
this["mimc"]._x=300
//es lo mismo que
mimc._x=300
//que 
variable_ref._x=300
//ó bien, algo más típico
for (i=0;i<10;i++){
   var mc=this["item"+i]
   mc._x=300*i
}


Por eso funciona una cosa y no la otra

(*)Realmente sucede si tenemos activada la opción de declarar automáticamente los nombres de instancia

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 16 Sep 2009 08:17 pm
Gracias Eliseo... a veces me hago lios con la nomenclatura.

Sin embargo, no acabo de entender porque no "alcanzo" ese MC por medio de "instance3".
Por lo que entiendo, debería ser posible.

Podrias aclararmelo con un ejemplillo.

Gracias.

Por Biktor

13 de clabLevel



 

firefox
Citar            
MensajeEscrito el 17 Sep 2009 07:48 am
Deberías poder alcanzarlo con

Código ActionScript :

parent.parent.parent.getChildByName("instance3") 

Vamos "instance3" es la propiedad "name" del MC (y es un STRING).

Vale, lo intento de otro modo. Imagina que tenemos en nuestra película un único Mc cuyo "nombre de instancia" es "mimc" y es de la Clase Mimc. Flash "internamente" escribe

Código ActionScript :

var mimc:Mimc=new Mimc()
mimc.name="instance3";
mimc.x=100 //<--la posición que lo tengamos en pantalla
mimc.y=20 //<--la posición que lo tengamos en pantalla
addChild(mimc)

"mimc" es una VARIABLE que hace referencia a un MC. Además es una variable que pertenece a la película principal. Ahora ¿cómo podemos hacer referencia a ese MC desde una función?

Código ActionScript :

function mostrarMc(){
   //por la propia variable
   trace(mimc)
   //con un getChildAt
   trace(getChildAt(0))
   //con un getChildVyName
   trace(getChildByName("instance3"))
 }


Vale, un poco sobre "parent". Cuando usamos parent, Flash sólo sabe que el "padre" es un DisplayObject -realmente un DisplayObjectContainer. Eso significa que no son accesibles las "variables", y por tanto, si ponemos nombre de innstancia no podremos addecer a ello. Es por eso que se hace una "conversión de Cast". Esto es, escribimos

Código ActionScript :

MovieClip(parent)
//ó
MovieClip(parent.parent)

Observa que no hay problema para escribir parent.parent, puesto que un DisplayObjectContainer sí que tiene accesible la propiedad "parent". Ahora sí podemos buscar el MC

Código ActionScript :

MovieClip(parent).mimc
//ó
MovieClip(parent.parent).otromc

Si lo que tenemos es la "propiedad name", no nos hace falta la "conversión de cast"

Código ActionScript :

parent.getChildByName("instance3")
//ó
parent.parent.getChildByName("instance3")

Aunque, de nuevo, getChildByName devuelve un "displayObject". Por eso, si tenemos una variable en un MC debemos hacer la conversión de Cast. Vale, un código más completo

Código ActionScript :

var mc_interior:MovieClip=new MovieClip()
var mc_contenedor:MovieClip=new MocieClip()
mc_interior.name="interior"
mc_contenedor.name="contenedor"
mc_interior.variable="Hola mundo"
mc_contenedor.addChild(mc_interior)
addChild(mc_contenedor)
//Cuando nos referimos por la variable funciona tal cual
trace (mc_contenedor)
trace (mc_interior)
trace (mc_interior.variable)
//cuando usamos getChildByName, devuelve un DisplayObject, por eso
trace(getChildByName("contenedor"))
trace(getChildByName("contenedor").getChildByName("interior"))
//pero...
trace(getChildByName("contenedor").getChildByName("interior").variable) //<---NO funciona
//debemos hacer una conversión de cast
trace(MovieClip(getChildByName("contenedor").getChildByName("interior")).variable) //<---ahora sí


Vale, la cosa se complica cuando hemos creado un MC dentro de otro MC en tiempo de diseño -no por programación- porque la variable pertenece al MC contenedor. Vamos que sería como si hiciéramos

Código ActionScript :

var mc_contenedor:MovieClip=new MocieClip()
var mc_contenedor.mc_interior:MovieClip=new MovieClip() //<--es una variable que "pertenece" a mc_contendor
mc_contenedor.mc_interior.name="interior"
mc_contenedor.name="contenedor"
mc_contenedor.mc_interior.variable="Hola mundo"
mc_contenedor.addChild(mc_contenedor.mc_interior)
addChild(mc_contenedor)


Puff, sé que es "espeso", al menos quedémonos con 3 ideas:
1.-No tiene nada que ver la propiedad name con el nombre de instancia.
2.-Cuando le damos nombre de instancia a un MC, realmente Flash crea una "variable"
3.-getChildByName devuelve un displayObject, por lo que es posible que necesitemos realizar una conversión de cast

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 18 Sep 2009 02:21 pm
Eliseo2... te quiero, tio ;-)

Ahora si que me aclaro.
He probado mi código, aplicando los conceptos que has explicado y todo perfecto.

De verdad, muchas gracias.

PD: aprovecho para dar las gracias a todos los que desde Cristalab, ayudais a los demás.
Gracias por vuestro tiempo y dedicación.

Por Biktor

13 de clabLevel



 

firefox

 

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