Cristalab

                 ¿Quieres registrarte?

Objetos visibles y contenedores en ActionScript 3

Por: AXM
10 de Octubre del 2007
455 de clabLevel
Otros artículos de AXM
23,554 visitas

Este tip esta hecho para aquellos que les ha dado duro pasar de ActionScript 2 a ActionScript 3 y están cabreados con Adobe. También para los que no entienden bien eso de addChild, getChildAt, y otros códigos extraños.

En este tip explicare los fundamentos para entender como Actionscript 3 Maneja los objetos gráficos en Flash. Y con gráficos me refiero a todo lo que uno puede ver como, texto, imágenes, vídeo y vectores.

Este tip esta hecho de lo que aprendí leyendo la guía de flash, el capitulo 12 “Programación de la visualización”. Pero si no quieres volverte loco con frases como “..hasta que se añada la instancia del objeto de visualización a un contenedor de objeto de visualización de la lista de visualización..”, :shock: lee esta guía.

Actionscript 3 vs Actionscript 2


AS3 trajo grandes cambios en la manera de hacer las cosas en flash. Y una de las cosas en las que Adobe hizo un cambio mas brusco, fue la manera de manejar la parte gráfica de Flash.
Pero aunque parezca que Adobe se complica innecesariamente con estos cambios en AS3, la verdad es que AS2 era insufrible a la hora de manejar la parte gráfica.

Por ejemplo en AS2, no había manera de saber cuantos objetos había en la película o en un MovieClip. El manejo de la profundidad era muy poco intuitivo. Para colocar un objeto al frente, había que utilizar getNextHighestDepth() que es muy fácil de escribí y recordar. Si uno quería hacer un juego de disparos, tocaba hacer un for horrendo para saber que objetos colisionaban con otros.

En fin, AS2 no es tan fácil como lo pintan. AS3 mejora muchas cosas y cuando uno lo entiende, es mucho más fácil y intuitivo de manejar que AS2.

Lo Básico


Pero bueno, entremos en materia. En AS3 hay dos tipos de objetos básicos, Objetos visibles, como un texto, imagen, vector y video y objetos contenedores, que vendrían hacer como una caja o carpeta donde uno mete los objetos visibles.


Los objetos visibles se llaman DisplayObject y los objetos contenedores se llaman DisplayObjectContainer. Pero cuales son los objetos contenedores?. Son 4.


Estos son los 4 tipos de contenedores en los que podremos colocar los objetos que se ven. El árbol genealógico quedaría así.


Propiedades de los objetos DisplayObject


Como vemos, el padre de todos es DisplayObject. Todos los hijos de DisplayObject (MovieClips, Vectores, Imágenes, etc) tienen las siguientes propiedades

Hay mas propiedades, pero estas son las mas importantes. El escenario es un objeto especial, puesto que no puede tener propiedades como alpha o x, y, rotation o parent, entre otras.

Los contenedores


Hay algo que hay que tener absolutamente claro. No se puede ver algo, si no esta adentro de un contenedor. El único elemento que no necesita de esto, es el escenario. Si no tienes esto claro, fracasaras en AS3.

¿Pero como agregamos algo al contenedor?

addChild();


Todos los contenedores tienen un método llamado addChild que traducido es “Añadir Niño”. Este es uno de los métodos mas importantes en AS3. En el siguiente código vamos a crear un texto y vamos a ver como funciona addChild.

Código :

var miTexto:TextField = new TextField(); // Creo el campo de texto
miTexto.text = "Hola @#♦*•#"; // Escribo lo que quiero que diga

Si colocamos este código, no veremos nada en el escenario, porque no lo hemos agregado a ningún contenedor. Ahora lo vamos agregar al contenedor Escenario

Código :

var miTexto:TextField = new TextField(); // Creo el campo de texto
miTexto.text = "Hola @#♦*•#"; // Escribo lo que quiero que diga
this.addChild(miTexto);


Si colocamos este código, vemos que en pantalla sale Hola @#♦*•#. Sencillo no?
Ahora Vamos a meter nuestro texto en un contenedor de tipo Sprite.

Código :

var miTexto:TextField = new TextField();
miTexto.text = "Hola @#♦*•#";

var miContenedor:Sprite = new Sprite(); // Creamos nuestro contenedor 
this.addChild(miContenedor); // Agregamos 

miContenedor.addChild(miTexto); // Agregamos el texto al contenedor


Si colocamos este código veremos que aparece nuestro Hola @#♦*•# en pantalla. Como vemos en este código, hay que agregar también los otros contenedores al escenario, si no hacemos esto, no serán visibles.

Tipos de contenedores


Para saber todas las características de cada tipo de contenedor lo mejor es ir a la referencia de Adobe.

La posición de un objeto dentro de un contenedor.


Otra de las cosas importantes, es que cada contenedor, tiene una lista de los objetos que le hemos metido adentro. Esta lista tiene tres datos, la posición dentro del contenedor, el tipo de objeto y el nombre.

Al código que vimos antes le agregamos un segundo texto y lo colocamos dentro del contenedor sprite

Código :

var miTexto2:TextField = new TextField();
miTexto2.text = "Chao @#♦*•#";
miTexto2.y = 20;
miContenedor.addChild(miTexto); // Agregamos el texto el segundo texto



Ahora le agregamos una imagen en un contenedor Loader

Código :

var carga:Loader = new Loader(); // Creamos el contenedor de carga
carga.load(new URLRequest("imagen_Cualquiera.jpg")); // Le damos el archivo a cargar
this.addChild(carga); // Agregamos el contenedor a la escena



Después creamos de manera grafica dos cuadros yc con F8 los convertimos en MovieClip y de nombre de instancia les ponemos cuadro1 y cuadro2. Colocamos el siguiente codigo.

Código :

miContenedor.addChild(cuadro2); // Colocamos el cuadro 2 en el contenedor

Si hicimos todo el código anterior, La estructura de nuestra película quedaria asi:


Con esta imagen se entiende bien el concepto de profundidad. Los objetos que están mas arriba, de la lista de visualización, aparecerán por delante. Si la imagen del ejemplo fuera muy grande, taparía todo lo demás por que esta en la parte mas alta de la lista.

Pero nada mas hemos visto addChild, y los contenedores tienen otros métodos y propiedades. Hay una propiedad, que nos dicen el numero de hijos que tiene un contenedor, o un método que nos permite buscar con el nombre un hijo dentro de un contenedor, o métodos que nos cambiar el orden del índice.

numChildren:

Nos permite saber cuantos hijos tiene un contenedor. En el ejemplo anterior seria.
trace(this.numChildren);
Resultado 3;

getChildAt():

Nos dice que objeto esta ocupando la posición que le indiquemos.
miContenedor.getChildAt(1).visible = false;
Se desaparece miTexto2

removeChildAt():

Saca del contenedor el objeto le indiquemos. miContenedor.removeChildAt(1);
Saca del contenedor miTexto2. Ojo no lo elimina, solo lo saca del contenedor, y al no estar adentro de ningún contenedor no se puede ver. Para eliminarlo se utiliza delete.

getChildByName():

Me busca el objeto que tenga el nombre que yo le diga
miContenedor.getChildByName(“Cuadro2” ).x = 200;
Me mueve el Cuadro2 horizontalmente hasta la posición 200;

setChildIndex():

Cambia la posicion de un hijo a donde nosotros le indiquemos
this.setChildIndex(this.getChildAt(2), 0);
Hace que la imagen se vaya al fondo de la película

addChildAt():

Agrega un hijo, pero nosotros le decimos en que lugar

getChildIndex():

Nos dice en que posición esta un hijo

Con esto claro será mucho mas fácil y divertido programar en AS3. Sin esto claro, sera un tormento, como escribir un tip con con el BBCode del foro.


Artículos Relacionados


Etiquetas actionscript_3

Comentarios | Enviar un comentario
Buen Tip AXM (y)
Por: Zguillez
Muy bueno para la transición de AS2 a AS3. Felicitaciones! ^^
Por: The Fricky!
AXM muy buen tip, me ha aclarado mas cosas acerca AS (y) ^^
Por: psycho-vnz
Exelente, con los diagramas quedó mas que explicado ^^
Si no me equivoco, la propiedad alpha (Le faltan las negritas) es de 0 - 1, o al menos así me funciona en la clase Tween
Por: bryanisimo
como diria monty burns....excelente.
Por: noctam_blog
Esto debo guardarlo en los marcadores y mirarlo luego con mas calma.

Parece muy útil e interesante. Tnks
Por: Bleend
Que buena hombre se fajo con este tema
Por: D-virus_blog
Muchas Gracias.
Por: Noja33_blog
fenomenal, muchas gracias, mestro!!!!
Por: oscar_blog
esta perron
Por: ganzo_blog
Realmente muy claro y gráfico. Excelente.
Si todos los tutoriales fueran así de claros, apoyándose en imágenes, todo sería más sencillo de comprender y hasta creo que motivaría a más de uno de hacer lo mismo.
Sólo creo que hay un pequeño detalle o yo lo hago mal, al crear en forma gráfica los cuadros, ambos serán visibles, pues se están creando en el contenedor escenario (stage) y como siempre los objetos tienen la propiedad visible=true... es así o yo comento error?
Gracias igualmente por este excelente tip, que para mí merece ser mini-tutorial

Saludos
Por: FerCoff_blog
Muy bien.
Ahora tengo dos fla el primero es el principal y alli tengo un var:loader1:Loader
al que cargo un swf.
Yo quiero que ese swf tenga acceso al principal

Como son las rutas ahora?
Por: javi_blog
muy bien.
es muy cierto eso de que una imagen vale mas de mil palabras.
thx
Por: devntn_blog
Excelentisimo, estoy adentrándome a la programacion Flash y esto es muy fácil e intuitivo.
Por: Nafiux_blog
Esto a mi me parece muy bien xk asi podremos RECICLAR xk el medio ambien te esta fatal osea tiooooo!!¡¡
Por: Carmen Maria_blog
Parece que algo aclara
Por: Tajajon_blog
Esta super bueno, queda todo bien explicado y de manera grafica.
muy currado....................
enhorabuena!!!!!!!!!!
Por: epinom-blog
mi respetos ,,tio ..te pasaste
Por: pdjazr-blog
Excelente tip ^^
Por: XKlibur
muy buen tutorial. Nunca use AS y necesito una idea basica. Esto esta muy claro!, y los graficos son excelentes...

gracias
Por: Jg-blog
Muy Buen tutorial.
Pero quisiera saber como modificar por ejemplo el contenido de un campo de texto dinámica a partir de código localizado dentro de un clip de película aplicando lo anterior. He empleado lo siguiente pero no encuentro solución:
En el escenario se encuentra campo de texto dinámico llamado "a" y clip de película "b".
El siguiente código localizado dentro del clip b, me genera el error:

stage.getChildByName(a).text = "Hola";

El error dice:

1119: Acceso a una propiedad text posiblemente no definida mediante una referencia con tipo estático flash.display:DisplayObject.

Gracias. Saludos
Por: charladito
Me encantó tu artículo, esta escrito de forma sencilla y amena:)
Por: Ethereal-blog
Muy muy bueno.
Por: aidonnou-blog
Este tipo de Tips son realmente buenos, explican conceptos basicos y nos permite comprenderlos de manera bastante clara, ayudandonos a leer y comprender mejor codigos mas extensos, como siempre digo: Para Aprender es Mejor comenzar por las Bases.
Por: Ricardo-blog
Que bueno mwe sirve para mis companeros de clase de Flash...
Por: Jair-blog
MUchas Muchas pero MUCHAS gracias, por compartir tu conocimiento y hacerlo claro con nosotros los que recien comenzamos!!!
Por: xoxolex00
Muchas gracias por el tip !!!! esta muy pero muy bueno :D
Por: lucaz
gracias muchisimas gracias a sido un tutorial excelente.
Por: h_multimedia
Un rayo de luz disipa (temporalmente) el cabreo con Adobe.

Gracias mil.
Por: Mostaza de Canela
Una pregunta.. se que debería estar en el foro, pero.. ¿Por qué si creo un documento en Flex de tipo AS 3.0, se crea un import de tipo Sprite (por defecto) una clase y una función pública con el nombre del proyecto y haciendo lo mismo en Flash CS3 no nesecito declarar el import, ni clase, ni función y en ambos funciona sin problemas?
Por: Noel Flores-blog
Excelente tutorial... es lo que me faltaba para avanzar en AS3... gracias
Por: ZEN-blog
Excelente. Muy claro. Entendible.
Gracias.
Por: Miguel-blog
Hola, tengo una duda sobre cómo acceder a las variables X e Y de un loader, intento acceder de forma : loader.x = 20; pero no funciona
Por: Tengo un problema!!-blog
Impresionante, sublime, exelente tip, gracias.
Por: anonimo-blog
exelente aportacion hermano
Por: silvano-blog
Deja un comentario
IMPORTANTE

Recuerda ser respetuoso, no insultes a otras personas, ni uses palabrotas, hay una persona al otro lado de la pantalla.

Habla bien, NO ESCRIBAS EN MAYUSCULA TODO, no escribas como en un SMS, evita cosas como "ke", "x q" y demás abreviaciones.

Aquí funcionan las etiquetas de los foros, puedes usar [b] para negrita, [img] para las imágenes, [url] para los enlaces, etc.

Si tienes preguntas técnicas, envíalas mejor al foro.