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, as3, dinámico, instanciar, variables
[…] 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 […]
Excelente ayuda…. la necesitaba bastante
Hola!, creo estar preguntando en el lugar indicado. Tengo el siguiente problema:
Quiero armar un for que cargue dinamicamente movieclips desde la biblioteca.
for (i=0;i<10;i++){
var m:MCdeLaLibreria_0 = new MCdeLaLibreria_0();
m.name = "mClip"+a;
m.x = 10*i;
m.y = 10*i;
addChild(m);
}
Hasta ahi todo bien, funciona. Pero el problema es que necesito que el CERO del linkage de la libreria (MCdeLaLibreria_0 <<–) vaya incrementando. No estoy seguro de que se pueda hacer, pero pregunto igual!
Saludos
Que tonto! la solución estaba en este tutorial :D solo me faltaba experimentar un rato mas! Saludos y un millon de gracias!
He he he, me da gusto que lo hayas encontrado!… Saludos!