Reparentar en AS3 con addChild

Publicado por Iván Gajate el 13 de diciembre de 2008 en AS3, Flash, Tutoriales

Una de las cosas que permite AS3 es cambiar un objeto a la lista de visualización de otro contenedor.

Si tenemos un clip de película en el escenario principal, tal vez nos interese colocarlo dentro de otro clip, para hacerlo arrastrable, o para que adquiera las modificaciones de forma de su contenedor… pero sin tener que eliminarlo y volverlo a crear dentro, como ocurría en AS2.

Podemos asignarle los listeners en una clase y luego mandarle la referencia a cualquier otra clase por muy profunda que esté, para que haga el addChild, y nuestros listeners seguirán apuntando a las funciones de la primera clase. Brutal!

Vamos a verlo con un ejemplo sencillo pero muy común:

 

Requerimientos: Nos mandan hacer una botonera para un menú lateral, y como no nos dicen nada, pues la programamos en nuestra clase principal, le asignamos los listeners ahí para que cuando se pulse un botón, cargar otra sección en ese mismo ámbito. Como todo está al mismo nivel, es fácil recoger los eventos y actuar en consecuencia.

// Creo una botonera con 5 botones
_botonera = new Botonera(["Quienes somos", "Trabajos", "Contrátanos", "Soluciones", "Contacto"]);

// Le pongo un listener para el evento "botonPulsado" que emite cada vez que se pulsa un boton
_botonera.addEventListener("botonPulsado", opcionSeleccionada);

// La añado al escenario principal. Por defecto en el 0,0
this.addChild(_botonera);

 

Cambios: Tenían que llegar, era inevitable 😉 Ahora nos dicen que la botonera mejor que vaya en un panel flotante, que se pueda girar, con una máscara, que sea colapsable y bla, bla, bla…

Ningún problema. Sólo tenemos que cambiar el contenedor de la botonera, pero los listeners seguirán apuntando a mi clase principal, y por lo tanto la aplicación seguirá funcionando sin problemas.

Tan solo hay que modificar la línea donde le indico que se añada al Display List del clip contenedor_mc, y dentro de éste, me meto en todos los niveles que quiera, es indiferente:

this.contenedor_mc.vacio1_mc.vacio2_mc.vacio3_mc.addChild(_botonera);

 

Lo mejor es que la botonera no la he eliminado, tan sólo la he cambiado de sitio, por lo que si tuviése alguna modificación, o botón seleccionado, no cambiaría para nada. El addChild tan solo la quita de una lista y la pone en otra.

El resultado podía ser algo así:

 

(Archivo Flash, para verlo necesitas Adobe Flash Player.)

 

 

15 comentarios para “Reparentar en AS3 con addChild”

  1. Grande!!! muchisimas gracias bro por el tip!!! m ayudaste mucho!! 😀

  2. Este dato es cojonudo, y no me lo hubiera imaginado nunca!