¿Cómo crear objetos dinámicamente?

2 views
Skip to first unread message

Alkalurops

unread,
Nov 13, 2009, 3:11:03 PM11/13/09
to ESPapervision3D
Saludos. Acabo de ingresar al grupo y vengo con un problema que a
priori parece sencillo pero me tiene ya tiempo parado.
Hace poco empecé con pv3d así que creo que me verán a menudo por
aquí :)

Resulta que en mi escena tengo un contenedor (DisplayObject3D) que
contiene varios objetos (TriangleMesh3D) y ahora me veo en la
necesidad de crear nuevos contenedores dinámicamente.
He probado varias soluciones que vi en internet como
http://shiftf12.net/category/herramientas/, adaptando el código fuente
a mi proyecto pero no consigo hacerlo funcionar.

Recibo "1120: Acceso a una propiedad contenedor2 no definida."

Así que ¿cómo puedo crear objetos en tiempo de ejecución y acceder
luego a ellos?

Gracias y hasta pronto.

laHabichuela

unread,
Nov 14, 2009, 2:32:16 PM11/14/09
to ESPaper...@googlegroups.com
A mi no me queda muy claro que es lo que quieres hacer, y la duda de como crear objetos dinamicamente, es sencillo, asi que imagino que no iran por ahi los tiros. En el mismo ejemploq que envias, te lo explica:

xejemplo, para crear 3 DisplayObject3D, 

var contenedor:DisplayObject3D;
var i:int;
var cantidad:int = 5;

for (i = 0, i < cantidad, i++) 
{
     contenedor = new DisplayObject3D();
     
     view.scene.addChild(contenedor);
     
     y aqui le añadirias los TriangleMesh3D o lo que sea, material, y si quieres algun nombre...
}

Mi consejo es que uses un array, o un diccionario o algo similar para almacenarlos, por que si no te vas a liar...

Si quieres pega algo de codigo, a ver que tal.

Miguel

Alkalurops

unread,
Nov 15, 2009, 8:34:20 PM11/15/09
to ESPapervision3D


Hola laHabichuela. Gracias por responder. Entiendo el código que
posteas pero creo que no es lo que necesito.

A ver si consigo explicarlo un poco mejor. Yo tengo en la escena x
objetos, 2 por ejemplo, y quiero que al pulsar un botón: 1º se creen 2
objetos por cada uno que ya existía, con algunas de sus propiedades
como rotation etc, y 2º se borren los primeros.

Es decir, si tenemos 2 objetos y hacemos click estos 2 objetos se
eliminan pero creamos 4.
Al hacer click otra vez, tendremos 8 y los 4 anteriores se eliminan. Y
así.

He intentado hacerlo con un bucle for each pero al crear y borrar
objetos en el mismo contenedor no podía controlarlo bien porque
supongo que se reorganizaban automáticamente y era un lío. Por eso
pensé en crear un contendedor para cada grupo de objetos cada vez que
daba al botón: contenedor1 - 2 objetos; contenedor2 - 4 objetos;
contenedor3 - 8 objetos...

En resumen, no sé como crear un contenedor y borrar el anterior cada
vez que doy click porque no sé como nombrarlos y recuperarlos luego.

Perdón por tanto rollo :S y gracias.

Alkalurops

unread,
Nov 21, 2009, 4:45:30 PM11/21/09
to ESPapervision3D
Hola de nuevo. Aún le estoy dando vueltas al asunto. Aquí os pongo más
claro el problema a ver si me podeis ayudar.
Esta es la escena:
http://perso.wanadoo.es/o_o_c/dodecaedro.swf

y esto es lo que hay en el botón:

// aqui se crea un contenedor donde irán los nuevos objetos
var contenedor:DisplayObject3D = new DisplayObject3D();
scene.addChild(contenedor);

// aqui se recorren los objetos del primer contenedor
for each (var c:DisplayObject3D in contenedor_x.children) {

// aqui se crean los nuevos objetos
var dod:Dodecahedron=new Dodecahedron(flat);
dod.scale= c.scale * 0.4 ;
dod.x = c.x;
dod.y = c.y;
dod.z = c.z + 30;
contenedor.addChild(dod);
//
var dod:Dodecahedron=new Dodecahedron(flat);
dod.scale= c.scale * 0.4 ;
dod.x = c.x;
dod.y = c.y;
dod.z = c.z - 30;
contenedor.addChild(dod);

// aqui se borran los objetoa anteriores
contenedor_x.removeChild(c);
//
singleRender();
}
// aqui se borra el contenedor anterior ya vacío
scene.removeChildByName("contenedor_x");

// y aquí renombro el nuevo contenedor para que el for each lo
reconozca la próxima vez, pero no funciona :(
contenedor.name = "contenedor_x";


Esta vez hay 4 objetos dentro de "contenedor_x" de inicio. Al darle al
botón, por cada objeto se crean 2 más (en otro contenedor) y debería
poder repetir esta operación con los objetos que quedan pero como
pueden comprobar no funciona.

El bucle for each sólo se ejecuta la primera vez. ¿Acaso luego no
reconoce "contenedor_x" aunque renombro al nuevo contenedor así? Creo
que el mío es un problema de conceptos, no sé. ¿Alguna idea?

Gracias

laHabichuela

unread,
Nov 22, 2009, 6:26:11 AM11/22/09
to ESPaper...@googlegroups.com
Yo creo que no lo haria con un contenedor fisico, vamos que en vez de meter los objetos como hijos de un displayobject, por que no los metes en un array? En vez de buscar los hijos del display object, buscas los elementos del array, haces todo el proceso, vacias el array y lo llenas con los elementos nuevos....

De todas formas, tu codigo deberia tirar, pero tienes un fallo de concepto, ponerle .name con el nombre no va a hacer nada mas que eso, ponerle a .name ese nombre...

yo creo que si cambias la linea

contenedor.name = "contenedor_x";

por esta:

contenedor_x = contenedor;

deberia tirar...

Alkalurops

unread,
Nov 22, 2009, 12:24:29 PM11/22/09
to ESPapervision3D
y tira, tira.. no se como pero funciona. ¡¡ Gracias laHabichuela !!
sólo cambiando esa línea.

http://perso.wanadoo.es/o_o_c/dodeca2.swf

Llevaba no os digo cuanto tiempo atascado con esto porque me da
verguenza :/ así que no sabes cuanto te agradezco laHabichuela. Te
debo una.

A partir del 7º click empieza a no trabajar bien pero no me importa
porque ya son más de 4000 triángulos y no contemplo llegar a tantos.

De nuevo muchísimas gracias ;)

Hasta pronto.

Miguel
Reply all
Reply to author
Forward
0 new messages