Shift F12

Icono

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

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, , , ,

5 Responses

  1. […] 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 […]

  2. Jirajara dice:

    Excelente ayuda…. la necesitaba bastante

  3. 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

  4. Que tonto! la solución estaba en este tutorial :D solo me faltaba experimentar un rato mas! Saludos y un millon de gracias!

  5. elhector dice:

    He he he, me da gusto que lo hayas encontrado!… Saludos!

Deja un comentario

Clicks más activos

  • Ninguno

RSS Últimos posts

  • Se ha producido un error; es probable que la fuente esté fuera de servicio. Vuelve a intentarlo más tarde.

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