Shift F12

Icono

Compendio de recursos para hacer magia en Flash y ActionScript :: por Héctor Padilla

Acceder a métodos de objetos creados dinámicamente

Soullost mandó una buena pregunta en este post, creo que vale la pena hacer un post de la respuesta. :-) Ya vimos cómo crear variables dinámicamente, e incluso cómo instanciar objetos de cualquier tipo dinámicamente. Pero, a partir de ahí: cómo puedo accesar las variables o métodos dentro de esos objetos?… 

El método getChildByName(nombre) nos regresa un objeto del tipo Objeto en ActionScript. Y como objeto tiene ciertas variables y métodos, que toooodos los objetos tienen. Y ya… Si tú sabes que el elemento que se llama «arbol5» es un arbol, y debe de tener métodos como «sacaFruta()», Flash no tiene porqué saberlo!. Para Flash lo que regresa getChildByName es un objeto simple y ya… 

Ok ok… ¿Entonces?… Pues tienes que indicarle a Flash que eso que te regresó getChildByName es algo diferente con una cosa que se llama «casting». Casting es decirle a un objeto que se comporte como algún otro. Si yo tengo un objeto llamado Arbol, y sé que getChildByName(«arbol5») me debe de regresar un Arbol, hacemos lo siguiente:

Arbol(getChildByName(«arbol5»));

Y listo :-) Con poner el NombreDeClase(  objeto_a_castear  ); ya le estamos diciendo a Flash que ese objeto en realidad es un Arbol, y con eso podemos accesar todas las variables y métodos públicos de esa clase. :-) Por ejemplo:

Arbol(getChildByName(«arbol5»)).sacaFruta();

Vaya… Siento que escribí mucho y dije poco. ¿Queda claro?… Si no díganme, y busco la manera de explicar esto mejor. :-) 


Filed under: AS 3, Flash, Tutoriales,

Cómo instanciar objetos de cualquier tipo dinámicamente

En el post anterior definimos ¿cómo crear variables de manera dinámica?, es decir, si tengo que poner 100 nubes en el cielo, en 100 posiciones diferentes, de qué manera puedo crearlas todas dentro de un ciclo for, en lugar de ponerlas a mano. Ok, pues eso ya está resuelto en el post anterior.

Lo de ahora es un poco más complicado, qué tal que no solo quiero crear nubes, sino que quiero crear todo el contenido que hay en un mundo virtual dentro de ese ciclo?. Qué tal que el mundo está definido en un archivo externo (xml?), y ahí se marca la posición de: enemigos, obstaculos, escaleras, etc. Y cada tipo de objeto tiene su propia clase… ¿cómo demonios puedo meter todo eso dentro de un ciclo for?…

Ahora la clave está en «getDefinitionByName», digamos que todos los elementos del mundo están en un arreglo bi-dimensional llamado «elementos[][]», y tiene algo asi:

elementos.push([«arbol», 0, 10, 50]);
elementos.push([«arbol», 0, 20, 30]);
elementos.push([«nube», 10, 20]);
elementos.push([«nube», 30, 20]);

Como verán, ahí hacemos referencia a dos tipos de objetos: arboles y nubes, y entre ellos pueden tener más o menos atributos. Lo que nos interesa es que en su primer elemento hagan referencia al tipo de objeto que son. Despues, dentro de nuestro ciclo podemos hacer lo siguiente:

var ClaseGenerica:Class = getDefinitionByName( elementos[i][0]) as Class;   
var cosa:Sprite = new ClaseGenerica(elementos[i][0], elementos[i][1], elementos[i][2]);
cosa.name = elementos[i][0] + i;
// así se llamaría nube1, nube2, arbol3, arbol4… etc 

Eso de «getDefinitionByName( elementos[i][0]) as Class » toma las palabras «arbol» o «nube» y lo utiliza como si fuera una clase… Nota: para que esto funcione la clase «arbol» o «nube» deben de existir junto con tus otros archivos, y deben de recibir como argumentos del constructor lo que indicamos en: ClaseGenerica(elementos[i][0], elementos[i][1], elementos[i][2]);  La manera más fácil de verlo es que en lugar de «ClaseGenérica» ahí dice «nube» o «arbol» o cómo sea que se llame tu clase. :-P

Y listo!… Tiene sentido?… Cualquier duda porfavor mándenme un comentario. Esto es MUY últil para varios proyectos, pero es complicado de manejar la primera vez. :-) Ya con algo así, puedes hacer que un arbol una vez iniciado comience a producir fruta por ejemplo, mientras que una nube comienza a moverse o a crear lluvia… o qué se yo. Clases independientes, pero todas instanciadas dentro del mismo ciclo. Esto reduce el número de líneas de nuestro código y aumenta la facilidad de darle mantenimiento. :-D

 

Extra: Recomiendo también ver este post para ahorrarse futuros dolores de cabeza.

Filed under: AS 3, Flash, Herramientas, , , ,

Ligas + nuevas

Páginas

Archivos

El Autor

Tengo como 10 años trabajando profesionalmente en Flash. Todo comenzó cuando tomé un taller de Flash 2 y me dí cuenta que era el entorno perfecto para mí (devigner empedernido).
Disfruto los problemas de programación y disfruto diseñar y crear experiencias interactivas visuales chidas. Flash era la mezcla perfecta para mí, y se ha mantenido siéndolo por todo este tiempo. En aquel entonces ni se mencionaba "ActionScript", hoy en día ActionScript 3 no deja de sorprenderme... Cada día hay algo más que aprender y la neta: que chido. :-D
-El Autor: Hector Padilla -

View Héctor Padilla's profile on LinkedIn