Comunidad de diseño web y desarrollo en internet online

¿Diferencia de jerarquías con AS2?

Citar            
MensajeEscrito el 21 Jul 2011 06:55 am
Aquí vengo a preguntar otra cosa rara de las mías.
Me he encontrado con que no sé qué diferencia hay entre "root" y "this" dentro de la línea de tiempo principal. Me explico. Si yo creo un par de variables dinámicamente en la línea de tiempo principal

Código :

this["variable1"] = "a";
this["variable2"] = 1;

puedo acceder a ellas mesiante sintaxis de puntos o array

Código :

trace (typeof(this.variable1));
trace (typeof(this.variable2));

apareciéndome en la ventana de salida

Código :

String
Number

Siendo, como digo, la línea de tiempo principal, si me encontraba en ella en AS2 podía referirme a ella como "this" o como "_root", por lo que podía acceder a las variables de esta forma:

Código :

trace (typeof(_root.variable1));
trace (typeof(_root.variable2));

En AS3 me he encontrado que con "this" sí puedo acceder a las variables, PERO NO CON "root", ya que me dice que no existen esas propiedades.
Si hago un trace de los objetos

Código :

trace (root);
trace (this);

la salida me da como resultado

Código :

[object MainTimeline]
[object MainTimeline]

por lo que, en este caso, "this" y "root" son el mismo objeto.

¿Se puede saber por qué diantre es válido "this.variable1" y no lo es "root.variable1"?

¿Se puede saber por qué se puede crear "this["variable1"]" y no es válido "root["variable1"]"?

gracias

Por CidDeMizar

81 de clabLevel



 

firefox
Citar            
MensajeEscrito el 21 Jul 2011 02:00 pm
La única diferencia es que root está declarado como DisplayObjectContainer (creo recordar) y this está declarado como MovieClip.

La clase MovieClip sí que puede leer los valores de las variables declaradas de la forma mc["variable"], pero la clase DisplayObjectContainer no. Lo que puedes hacer es meter un catch para que root se comporte como un MovieClip:

Código ActionScript :

root["variable"] = "hola mundo";
trace(MovieClip(root).variable); // Salida: hola mundo


Un saludo :)

Por nestorrente

1010 de clabLevel

10 tutoriales

 

Vigo

firefox
Citar            
MensajeEscrito el 23 Jul 2011 09:53 pm
Gracias por la respuesta nestorrente, pero ahora me asalta una terrible duda.

En mis proyectos, mucha gente tiene que ser capaz de manipularlos de forma sencilla, ya que no tienen ningún tipo de conocimiento informático. Normalmente, las variables se cargan por ficheros de configuración externos.

Es bastante habitual que los campos de texto se rellenen en base a variables ubicadas en esos ficheros externos de configuración. Lógicamente, estos campos de texto pueden estar en cualquier línea de tiempo.

Lo normal, es que los diseñadores creen y coloquen esos campos de texto donde les venga en gana o crean conveniente. Para evitarme problemas les decía que en el campo correspondiente del panel de propiedades de ese campo de texto puesieran el nombre de la variable correspondiente a su texto. Esto podía ser algo como "texto1". Cuando vi que los campos de texto muchas veces no estaban en la línea de tiempo principal les dije (para que no se armasen líos) que pusieran siempre el "_root" delante, esto es "_root.texto1". Así sabía que el campo iba a cargar bien la variable.

En su momento, eso de poner "_root" delante les fastidió bastante y muchas veces se olvidaban, pero se acostumbraron.

Ahora, por lo que he entendido de tu respuesta, en el campo de propiedades corresponiente a variable, deberán poner algo así como "MovieClip(root).texto1".

Lógicamente no les voy a decir que me pongan "parent.parent.parent.parent.texto1" porque me matan ya que no van a saber en qué profundidad han creado sus movieclips ni sus campos de texto.

Si he entendido bien y la cuestión es poner "MovieClip(root).texto1" ¿Me podríais decir si esxiste una alternativa que se asemeje más a la antigua de "_root.texto1"? Lo digo porque me imagino que se van a mosquear. Eso sí, si no queda más remedio, que se acostumbren.

Gracias miles.

Por CidDeMizar

81 de clabLevel



 

firefox
Citar            
MensajeEscrito el 24 Jul 2011 09:44 am
Mil perdones a todos. Fallo mío. Y además, DE PRINCIPIANTE. Me había estado cegando con todo mi precioso código de lectura, carga y creación de variables en el frame 1 de mi película, sin darme cuenta de que todas las creaciones y cargas las realizaba dentro de funciones que se lanzan al cargar un fichero externo de configuración, mientras que la lectura de las variables (esto de root["variable1"] o this["variable1"] lo hacía fuera de la función, por lo que lógicamente las propiedades no estaban, no existían.

La solución, pues la de siempre, la típica: hago un stop() en el frame 1, cargo los datos y, cuando se dispara el evento de carga finalizada, voy a currentFrame+1. Por fin tengo mis variables accesibles.

Eso sí, sólo puedo acceder a las variables en modo Array (root["variable1"], root["variable2"], etc.) . Es una pequeña pu...da pero me servirá por el momento.

Como siempre, gracias por vuestra ayuda y paciencia.

Por CidDeMizar

81 de clabLevel



 

firefox

 

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