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..”, 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
- alpha = Nivel de transparencia. Predeterminado 100
- height = Altura en pixeles.
- width = Anchura en pixeles.
- name = nulo. Flash le coloca un nombre hasta que nosotros le demos el propio
- parent = el contenedordonde esta.
- rotation = Rotación. Predeterminado 0
- scaleX = Escala horizontal. Predeterminado 1
- scaleY = Escala vertical. Predeterminado 1
- visible = Si es visible o no. . Predeterminado true
- x = Posición en horizontal en pixeles. Predeterminado 0
- y = Posición en vertical en pixeles. Predeterminado 0
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.
- Guía Stage o Escenario
- Guía Loader. Este objeto solo puede tener un hijo. El objeto que carga con el método load.
- Guía Sprite
- Guía MovieClip
- Guía DisplayObjectContainer
- Guía DisplayObject
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 digamiContenedor.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 indiquemosthis.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 lugargetChildIndex():
Nos dice en que posición esta un hijoCon 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.
¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.
Por Zguillez el 11 de Octubre de 2007
Por The Fricky! el 11 de Octubre de 2007
Por psycho-vnz el 11 de Octubre de 2007
Por bryanisimo el 11 de Octubre de 2007
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 noctam el 11 de Octubre de 2007
Por Bleend el 11 de Octubre de 2007
Parece muy útil e interesante. Tnks
Por D-virus el 12 de Octubre de 2007
Por Noja33 el 18 de Octubre de 2007
Por oscar el 24 de Octubre de 2007
Por ganzo el 01 de Noviembre de 2007
Por FerCoff el 12 de Noviembre de 2007
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 javi el 22 de Noviembre de 2007
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 devntn el 27 de Diciembre de 2007
es muy cierto eso de que una imagen vale mas de mil palabras.
thx
Por Nafiux el 23 de Enero de 2008
Por Carmen Maria el 18 de Febrero de 2008
Por Tajajon el 04 de Marzo de 2008
Por epinom el 05 de Mayo de 2008
muy currado....................
enhorabuena!!!!!!!!!!
Por pdjazr el 14 de Junio de 2008
Por XKlibur el 14 de Junio de 2008
Por Jg el 23 de Junio de 2008
gracias
Por charladito el 01 de Septiembre de 2008
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 Ethereal el 08 de Septiembre de 2008
Por aidonnou el 25 de Septiembre de 2008
Por Ricardo el 14 de Octubre de 2008
Por Jair el 17 de Diciembre de 2008
Por xoxolex00 el 23 de Enero de 2009
Por lucaz el 04 de Febrero de 2009
Por h_multimedia el 19 de Febrero de 2009
Por Mostaza de Canela el 22 de Febrero de 2009
Gracias mil.
Por Noel Flores el 11 de Marzo de 2009
Por ZEN el 25 de Marzo de 2009
Por Miguel el 08 de Abril de 2009
Gracias.
Por Tengo un problema!! el 18 de Abril de 2009
Por anonimo el 06 de Mayo de 2009
Por silvano el 30 de Junio de 2009
Por andresxx1 el 16 de Julio de 2009
Por brokercl el 16 de Julio de 2009
muchas gracias x tu trabajo
Por Kike314 el 18 de Julio de 2009
Por gerlin el 06 de Octubre de 2009
Por Edgar el 28 de Octubre de 2009
Por Lucas Bustamante el 28 de Octubre de 2009
Por Lucas Bustamante el 28 de Octubre de 2009
es en AS3 gracias
Por frozen el 04 de Noviembre de 2009
please .....
que pasa si la pelicula que adhiero es mas grande que el contenedor ?? y alreves ?? toma la medida del contenedor o lo agranda????
como seria en codigo ????
Por REDImei el 08 de Noviembre de 2009
Mi problema es que los hijos se van colocando en la capa de atras y yo quiero que se coloquen en la de alante.
Espero haberme explicado bien pq soy nuevo en esto, pero aun asi me ha abierto los ojos este tutorial, gracias.
Por zumimoraes el 16 de Diciembre de 2009
Gracias otra ves!!
Por Deivtox el 13 de Enero de 2010
Por Edmundo el 18 de Enero de 2010
Por Diana el 28 de Enero de 2010
Trato de colocar botones en el stage del swf principal pero no se activan quizas porque tengo otro encima... cómo puedo hacer?
Por Carlita el 23 de Marzo de 2010
Por Ray el 14 de Abril de 2010
Por ruth el 20 de Mayo de 2010
Por ruht el 20 de Mayo de 2010
Por Alejo gomez el 22 de Mayo de 2010
Por sebastian el 04 de Julio de 2010
Tengo que hacer en Flashcs3 una "simple animacion" ocupando as3, la cual consiste tener dividida la zona de trabajo en parte izquierda y derecha,un balon en la parte derecha al arrastrar el balon debe quedar otro balon arrastrable en el lugar del otro balon ,cuando pase el balon a la zona izquierda debe contabilizar los balones que se llegaran a acumular.
algun amigo me dio esta instruccion :
var pelota=getChildByName("pelota"+1)as movieClip;
pero flashcs3 dice que hay conflictos. ¡ alguien me puede ayudar¡ gracias de antemano por la ayuda.
Por ernestrod el 28 de Julio de 2010
Por alex_ven el 11 de Agosto de 2010
Por jarry el 22 de Septiembre de 2010
Por uriel2707 el 24 de Septiembre de 2010
Por nnata el 26 de Abril de 2011
Por egonzalez el 21 de Junio de 2011
Por egonzalez el 21 de Junio de 2011
Por Finvara el 23 de Marzo de 2012
miContenedor.addChild(miTexto); // Agregamos el texto el segundo texto
debería ser así
miContenedor.addChild(miTexto2); // Agregamos el texto el segundo texto
Por sharinglanguage el 23 de Abril de 2012
Por Luis55_2 el 18 de Agosto de 2012
Por desfaz el 09 de Octubre de 2012
Por Harold el 11 de Enero de 2016