Pequeña duda con Papervision 3D
Buenas,
Estoy mirando de crear un ejemplo sencillito con PV3D con lo cual genero una cuadrícula de "planes"
<code>var rows:Number=5;
var cols:Number=5;
for(var i:Number=0; i<rows; i++){
for(var j:Number=0; j<cols; j++){
var color1:ColorMaterial = new ColorMaterial();
color1.fillColor = color_list[int(Math.random()*6)];
color1.fillAlpha = 0.7+0.3*Math.random();
var plane:Plane=new Plane(color1,200,200,1,1);
plane.material.doubleSided = true;
plane.x=i*210;
plane.y=j*210;
scene.addChild(plane);
plane.container.addEventListener(MouseEvent.MOUSE_OUT, onMouseOut);
plane.container.addEventListener(MouseEvent.MOUSE_OVER, onMouseOver);
}
}</code>
El tema es q no es un solo plane sino varios asi q... como puedo hacer referencia a ese plane desde la funcion "onMouseOut"?
Usando "target" sobre el event me devuelve un Sprite y no el plane.
Debería ser muy básico el tema. Es más sobre AS3 que sobre PV3D.
Gracias por anticipado como siempre :)
ozke
No sé pq dices q se nota q no eres programador pq t has explicado muy bien y he resuelto mi problema tío.
Muchas gracias :)
tpmmds
No sé si no conseguí explicarme bien, :-):
En el diccionario que creas guardas una referencia al plano3D a través del container de dicho plano. Por eso, cuando pulsas sobre el plano (realmente pulsas sobre un sprite que tiene el mencionado container), a través de la referencia que le pasas al diccionario a través de evt.target lo que recuperas es el container y, por tanto, la referencia guardada a dicho plano.
Esta forma la "tomé prestada" de cómo lo hacen algunos ejemplos que hay en el blog de Papervision.
Otra forma de hacerlo es utilizar la propiedad name del container de cada plano. Das un nombre a dicho container, y el mismo nombre al plano. En el método controlador de eventos onMouseOver recuperas ahora:
evt.target.container.name,
y dicho nombre lo utilizas para obtener el plano. Si tu espacio 3D se llama miScene3D, por ejemlo, harías
var plano:Plane = Plane(miScene3D.getChildByName(evt.target.container.name));
He visto también esta forma de hacerlo, pero a mí me parece un poco más fina la anterior :-) Por cierto, he escrito las líneas de código directamente aquí, por lo lo que se me ha podido pasar algo. En el ejemplo siguiente utilicé esta forma de hacerlo:
http://blog.coconnut.com/source/jel/simon/
La clase
jel.com.effects.MenuGiratorio.as
que muestra el menu giratorio para seleccionar el avatar utiliza Papervision y empleé esta forma de recuperar el plano pulsado, porque así obtenía también el nombre del jpg que el jugador selecciona.
Un saludo.
P.D.: Por cierto, como has notado, no soy programador :-)
ozke
Por cierto!
Sigo teniendo el mismo problema. Eso está guay para asignar un nombre de variable dinámico pero... como sabe la función rollOver a que variable de Dictionary acceder? :S
ozke
Woo!
Muchas gracias tio!
Está perfectamente redactado.
¿Ahora bien, esto no es como una especie de variable global? ¿No rompe un poco los principios de encapsulacion y bla, bla?
Me preocupa tb q no joda el rendimiento y tal.
:?
¿Algún purista en la sala?
tpmmds
Puedes crearte un Dictionary y pasarle como clave el container de cada plano:
<code>
private var diccionario:Dictionary = new Dictionary():
.......
var container:Sprite = plano.container;
container.buttonMode = true;
container.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
diccionario[ container ] = plano;
.........
private function onMouseDown(evt:MouseEvent):void {
var plano:Plane = diccionario[evt.currentTarget];
}
</code>
Un ejemplo que hice con Papervision, lo puedes ver en:
http://blog.coconnut.com/source/jel/carrusel3d/
Para ver el código pulsa con el botón derecho sobre la aplicación y elige "view source". La clase jel.com.pv3d.Escenario3D.as es la que crea todo el entorno en Papervision
Un saludo, y espero que te sea de ayuda.
P.D.: Escribo desde un portatil, y me resulta bastante complicado escribir, perdón por la mala redacción :-(