_root vs. _parent …o no??

VictorR Martes, 24 de Enero del 2006

Etiquetas:

En ocasiones me he encontrado con que he necesitado cargar un movie clip externo dentro de una aplicación más grande y que requería de las funcionalidades de estos movie clip’s con la sorpresa que utilizaban la propiedad “_root” y fallaban.

Esto me suponía un gran problema, ahora no. Ahora os explicaré cómo solucionarlo y una alternativa a esta propiedad.

_root, como dice la ayuda de Flash, especifica o devuelve una referencia al nivel principal del movie clip que estamos editando. Lo que supone que, si cargamos un movie clip que utilice esta propiedad, _root apuntará al nivel principal del movie clip padre y no al suyo como debería estar haciendo.

Una alternativa es la de utilizar SIEMPRE la propiedad _parent. Esta propiedad, especifica o devuelve una referencia al movie clip u objeto que contiene el actual movie clip u objeto, como dice la ayuda de Flash. Esto quiere decir que si cargamos un movie clip dentro de otro seguirá apuntando al nivel que apuntabamos cuando desarrollamos el movie clip hijo. Así nos ahorramos el problema.

Sin embargo, mirando detenidamente la ayuda de Flash, podemos encontrar otra solución. Esta solución nos permite seguir utilizando la propiedad _root sin problemas. Para ello debemos bloquear el nivel root del movie clip hijo, ya sea desde dentro del movie clip hijo o desde el padre. El objeto MovieClip tiene una propiedad, booleana, _lockroot, que nos hace la vida un poco más fácil.

//desde dentro del movie clip cargado.
MovieClip._lockroot = true;
//desde el movie clip padre
myMovie._lockroot = true;

Cuando me planteé escribir este artículo, no conocía esta propiedad de la clase MovieClip. Así que pretendía aconsejar utilizar siempre la propiedad _parent para evitar estos problemas. Sin embargo, aunque seguiré utilizando _parent por mi mala memoria, sabed que hay un remedio mejor que modificar todo el código de un movie clip cuando utiliceis _root y carguéis ese clip en otro. La elección de dónde utilizarla es vuestra.

Un saludo, y hasta el próximo artículo.

11 comentarios a "_root vs. _parent …o no??" »
Comentario de Admirador/a secreto/a — Lunes, 30 de Enero del 2006 @ 20:44

la verdad es que aunque no acabe de entender la mayoria de las cosas, parece muy interesante todo lo q vas publicando en este blog tan bonito!!
Pequeñas iniciativas como ésta son las que nos rescatan de la rutina, asi que enhorabuena!!

Comentario de jaumeAV — Miércoles, 1 de Febrero del 2006 @ 2:48

vaaaaa admirador secretooo q sabemos quien eresss :D

victor, adelante con ello.. yo te leo siempre que sacas cosas nuevas ;)

pq no pruebas de promocionarte mas por distintos lugares? asi tendras mas feedback. metete en listas de distribucion y comunidades de actionscript, foros etc etc..

lugares como pepitolista, ovillo, etc.. por ahi seguramente sacaras feedback y mas feeback.

aqui uno que te lee y que la mayoria de veces no consigue entender del todo lo que pone.. pero seguro q algun dia ;)

un abrazo.. AH! y felicidades adelantadas! :D

Comentario de VictorR — Miércoles, 1 de Febrero del 2006 @ 12:00

Hola Jaume,

no me promociono principalmente porque no tengo tiempo ni sabría por donde empezar. El poco tiempo que tengo lo prefiero dedicar a montar los artículos y mis proyectos. Creo que si lo que escribo cada vez va siendo más interesante el feedback llegará solo.

Si alguna cosa no la entiendes igual es que no me explico bien, cosa que me preocupa. También puedes preguntar lo que no entiendas y yo intentaré explicártelo mejor…

un saludo y gracias!!

@Admirador/a secreto/a: gracias por el apoyo, yo también te admiro ;)

Comentario de edu — Domingo, 6 de Agosto del 2006 @ 13:00

no entiendo todavia a q referencia _root :S alguien podria poner un ejemplo simple?
comentando q hace??

Comentario de VictorR — Lunes, 7 de Agosto del 2006 @ 13:43

Hola edu,

_root hace referencia al nivel principal de la aplicación por decirlo de alguna manera. Es la referencia al movie clip principal de la aplicación, ya sea una presentación, animación, RIA, etc.

A ver si me explico un poco mejor con un simple ejemplo.

Supongamos que tenemos 2 movie clips (2 fla separados por ejemplo), uno llamado Contenedor.fla y el otro Animacion1.fla.

si editamos el Contenedor.fla y cargamos el movie clip Animacion1.swf con el loadMovieClip() cuando dentro de Animacion1 hacemos referencia a _root, sin la propiedad _lookroot a true, hará rerencia al movie clip Contenedor, sin embargo poniendo la propiedad _lookroot a true, la referencia cambia a si mismo.

Es decir, que si vamos anidando movie clips dentro de movie clips acabamos teniendo tantos niveles como movie clips anidados tengamos, por lo que la referencia a _root puede crear problemas si no se utiliza con cuidado.

Para entenderlo mejor intenta jugar anidando varios movie clips e intenta acceder a ellos desde diferentes niveles partiendo de _root con _lookroot a true y a false, verás que el acceso a estos movieclips fallará según el valor de esta propiedad.

Si tienes alguna duda más, no dudes en preguntar…

dejo una referencia a livdocs para mayor información: _root property

Comentario de Salvador Zapata — Miércoles, 16 de Agosto del 2006 @ 12:05

Muchísimas gracias por este artículo, me has ahorrado mucho trabajo.
:D

Comentario de pablo — Domingo, 1 de Febrero del 2009 @ 10:19

hola victor: necesito que me ayudes en esto, tengo un boton dentro de un clip de pelicula, dicho clip esta metido dentro de otro clip de pelicula, yo necesito que ese boton me vaya a un fotograma concreto en la escena 1. he probado mil combinaciones y ninguna me resulta. todo el mundo habla de _root y _parent pero eso es siempre entre clips de pelicula, pero yo necesito ir a la escena 1. ¿como hago?
gracias

Comentario de VictorR — Lunes, 2 de Febrero del 2009 @ 11:53

Hola pablo, a ver si te puedo ayudar. Si he entendido bien tienes algo así.

Clip ESCENA 1, que tiene dentro otro Clip (que llamaré ESCENA 2 para seguir la nomenclatura) y dentro de ESCENA 2 un botón.

Si está situación es correcta el botón entiendo que debería llamar

this._parent._parent.gotoAndStop(FOTOGRAMA_EN_ESCENA_1);

donde FOTOGRAMA_EN_ESCENA_1 puede ser un número o una etiqueta que le hayas asignado al frame requerido.

La cuestión es usar tantas veces la palabra “_parent” como niveles de profundidad existan entre el botón y el clip que quieras comunicar.

Si esto no es suficiente. Siempre puedes hacer “traces” sobre las llamadas _parent que hagas para ver en qué nivel estás en todo momento. Esto creo que es lo que mejor te puede ayudar a la hora de usar _root o _parent en los clips.

Espero haber sido de ayuda, si sigues teniendo problemas ya sabes dónde puedes encontrarme.

Un saludo!

Comentario de pablo — Martes, 3 de Febrero del 2009 @ 12:38

victor: gracias pero ya lo habia solucionado. el tema era asi (por si a alguna otra persona le sirve), yo tenia en la escena principial un submenu hecho con clip de pelicula (llamado “submenu_equipo”). dentro de ese submenu un 2º submenu hecho tambien con clip de pelicula (llamado “subsubmenu_quienes”). yo necesitaba que al hacer click en el boton que estaba dentro del 2º submenu (“subsubmenu_quienes”), vaya al fotograma 45 de la escena 1 y me volviera todos los clips de pelicula al fotograma 1 de su respectiva linea de tiempo. despues de probar y probar lo solucione asi:

//las 3 acciones van en el mismo boton
//me lleva al fotograma 45 de la escena principal
on (press) {
_root._root.gotoAndPlay(45);
}
//me lleva al fotograma 1 de submenu_equipo
on (press) {
_parent.gotoAndStop(1);
}
//me lleva al fotograma 1 del subsubmenu_quienes (el anidado)
on (press) {
gotoAndStop(1);
}

habia probado poner _parent varias veces seguidas pero nunca me dejo hacerlo. solamente con _root ya que por lo que tengo entendido el _parent es solo para clips de pelicula, pero puedo estar equivocadisimo porque soy demasiado nuevo en esto.
tambien habia leido en otro foro que no se podia llamar a la escena 1 desde un clip de pelicula pero en fin…
muchisimas gracias por tomarte el tiempo de responderme
pablo

Comentario de Martin Rios — Martes, 26 de Mayo del 2009 @ 6:07

y cual sería el código si todo estuviera en AS3 ??????

Comentario de VictorR — Martes, 26 de Mayo del 2009 @ 22:50

Hola Martin, no tengo experiencia con AS3, hace tiempo que no me dedico a programar con flash profesionalmente. Lo que te puedo comentar es que “_root” y “_parent” han cambiado a “root” y “parent” respectivamente en AS3.

Puedes tener una mayor información aqui: DisplayObject

Ahora tocaría hablar de la mayor modificación que ha sufrido AS con su versión 3, que es que los MovieClips han dado paso a los DisplayObjects (más concretamente a una subclase Sprite) de los que heredan las clases MovieClips, pero es un tema largo y que da para un estudio que no tengo y que requiere más tiempo.

No dejes de visitar la referencia (el API vaya): AS3 Livedocs

imprescindible con cualquier lenguaje de programación.

Un saludo!

Suscripción RSS a los comentarios de esta entrada. TrackBack URL

Deja tu comentario

* Obligatorio. ** Obligatorio, no será publicado.