Comunidad de diseño web y desarrollo en internet online

problema Papervision y target

Citar            
MensajeEscrito el 19 Jun 2008 05:43 am
Tengo el siguiente código funciona bien, pero necesito que al a hacer click en cualquier cubo me lo identifique para aplicarle un efecto pero no se como hacer ya probé con target y currentTarget.

No se que propiedad me identifica un objeto en particular al hacer click en papervision es lo que necesito


Código :

package
{
import flash.display.Sprite;  
import flash.events.Event;
import flash.events.MouseEvent;
   
import org.papervision3d.cameras.*;
import org.papervision3d.core.render.data.RenderHitData;  
import org.papervision3d.materials.MovieMaterial;
import org.papervision3d.materials.ColorMaterial;
import org.papervision3d.materials.utils.*; 
import org.papervision3d.objects.primitives.Cube;  
import org.papervision3d.render.BasicRenderEngine;  
import org.papervision3d.scenes.Scene3D;  
import org.papervision3d.view.Viewport3D;
import org.papervision3d.objects.DisplayObject3D;
import flash.utils.getDefinitionByName;
import org.papervision3d.events.*;

   
   
   [SWF(width = "720", height = "600")]  
    public class mmPP3dMenu extends Sprite  
    {
   private var viewport:Viewport3D;  
        private var scene:Scene3D;  
        private var renderer:BasicRenderEngine;  
   private var planeGroup:DisplayObject3D;
   private var camera:Camera3D = new Camera3D();
 
          
      
          
        public function mmPP3dMenu()
      {
         
      //inicializar 3d
         viewport = new Viewport3D( 720, 600, false, true );
         addChild( viewport ); 
         viewport.buttonMode = true;
         scene = new Scene3D();  
      //camera = new FreeCamera3D();
         camera.zoom = 10;
         camera.focus = 100;
            renderer = new BasicRenderEngine();
      //crea objetos
         var i:Number;
         
         planeGroup = new DisplayObject3D();
         
         for (i = 0; i < 3; i++) {
            var material:ColorMaterial = new ColorMaterial(Math.random() * 0xFFFFFF);
            var material2:ColorMaterial = new ColorMaterial(Math.random() * 0xFFFFFF);
            var material3:ColorMaterial = new ColorMaterial(Math.random() * 0xFFFFFF);
            
            
var t:Cube = new Cube(new MaterialsList( { front:material, back:material,left:material2, right:material2, top:material3, bottom:material3 } ), 200, 50, 200, 10, 10, 10);
            addEventListener(MouseEvent.MOUSE_DOWN, onEnterFrame);
            t.name = ("cubo"+i);
            trace(t.name);
            
            
            t.rotationX = (Math.random() * 40)*i;
            //cubo.x = ( 220 * i ) - 250;
            t.x = ( 220 * i ) - 250;
            t.z = ( 220 * i ) - 250;
            planeGroup.addChild(t);
            }
            
               scene.addChild(planeGroup);
               renderer.renderScene(scene, camera, viewport); //renderisar 3d 
      //listeners
         }
         public function onEnterFrame(e:Event):void 
         {
            trace(e.target);
// aqui me arroja object ViewportBaseLayer que puedo hacer para que me identifique el cubo
//en el que hago click el probé con e.currentTarget y me arroja object mmPP3dMenu
            }
         
    } 

} 


Gracias Por Su Coloración de Antemano[/b]

Por tremulousevolution

13 de clabLevel



 

firefox
Citar            
MensajeEscrito el 19 Jun 2008 10:40 am
Hola!
Dentro del "for" pones

Código :

if(i = 0){ 
t.addEventListener(InteractiveScene3DEvent.OBJECT_PRESS, 1clicked);
}
if(i=1){
t.addEventListener(InteractiveScene3DEvent.OBJECT_PRESS, 2clicked);
}
......
luego fuera del "for" le pones 
private/public function 1clicked(event:InteractiveScene3DEvent):void{
      trace("The object 1 was clicked");
}
private/public function 2clicked(event:InteractiveScene3DEvent):void{
      trace("The object 2 was clicked");
}
.......

Prueba lo para ver si te funciona.

Realmente no sé de qué te sirve el evento de target.
Yo nunca lo he utilizado y por eso no lo conozco cómo va exactamente y no te lo puedo decir.

Este código puede que funcione solo con formas primitivas de papervision.Tal vez si importas objeto de fuera,tendrás que cambiar el codigo para que te haga caso al clickear le.

editado por eldervaz

Por Nycksan

73 de clabLevel



 

msie
Citar            
MensajeEscrito el 20 Jun 2008 05:22 am
como lo planteas esta bien, pero resulta bien cuando tenemos definido desde el principio todos los objetos y cada objeto solo accede a su función, cuando necesitamos crear un menú dinámico xml la idea es que todos los objetos accedan a una función cuando le hacemos click o el evento que sea, trabajado e usado target o currentTarget básicamente me devuelve el nombre del objeto que accede a la función cuando el listener lo detecta y no es necesario crear la misma funcion para cada objeto sino que todos los efectos de la funciones se aplican sobre la propiedad target y con una función basta

en resumen necesito que me devuelva el nombre del objeto al que le he dado click para no tener que crear una función por cada objeto como lo planteas

Igualmente Gracias

Por tremulousevolution

13 de clabLevel



 

firefox
Citar            
MensajeEscrito el 20 Jun 2008 10:12 am
Hola!

Código :

import org.papervision3d.utils.virtualmouse.VirtualMouse;
import org.papervision3d.utils.virtualmouse.IVirtualMouseEvent;
import org.papervision3d.utils.InteractiveSceneManager;
import org.papervision3d.events.InteractiveScene3DEvent;

scene.interactiveSceneManager.addEventListener(InteractiveScene3DEvent.OBJECT_CLICK, clickear );

function clickear(event:InteractiveScene3DEvent) {
         trace( "Has hecho click en:" + event.displayObject3D );
}


Intenta con eso y ojalá te sirva.

Hasta otra!

[SWAT]
Utiliza etiquetas CODE,
editado por eldervaz
[/SWAT]

Por Nycksan

73 de clabLevel



 

msie
Citar            
MensajeEscrito el 20 Jun 2008 08:45 pm
Nycksan tu código mas target funciona mas un poco de lectura

aquí les dejo el código la verdad no es la gran cosa son cubos que giran al hacer clic pero es la base para la interactividad y para hacer menús 3d.



Código :


package {
    
    import flash.display.Sprite;
   import flash.events.Event;
   import flash.events.MouseEvent;
    
    import org.papervision3d.cameras.FreeCamera3D;
    import org.papervision3d.events.InteractiveScene3DEvent;
    import org.papervision3d.materials.ColorMaterial;
   import org.papervision3d.materials.utils.*;
    import org.papervision3d.objects.DisplayObject3D;
    import org.papervision3d.objects.primitives.Cube;
   import org.papervision3d.objects.*;
    import org.papervision3d.render.BasicRenderEngine;
    import org.papervision3d.scenes.Scene3D;
    import org.papervision3d.view.Viewport3D;
   
   [SWF(width = "640", height = "480", backgroundColor = "0x000000", frameRate = "30")]
   
    public class PP3dMenuI extends Sprite
    {
        private var scene:Scene3D;
        private var camera:FreeCamera3D;
   
        private var material:ColorMaterial;
       
        private var nombres:Array;
      
      //needed with GreatWhite;
        private var viewport:Viewport3D;
        private var renderer:BasicRenderEngine;
       
        public function PP3dMenuI()
        {
            init();
         init3D();
            createObjects();
            createListeners();
        }
       
        private function init3D():void
        {
            //GW properties :
            viewport = new Viewport3D(stage.stageWidth , stage.stageHeight , true , true);
            renderer = new BasicRenderEngine();
            addChild(viewport);
            scene = new Scene3D();
           
          
            camera = new FreeCamera3D();
            camera.zoom = 20;
            camera.focus = 10;
        }
      
      private function createObjects():void
      {
         nombres = new Array();
      
      
      
      for ( var i:uint = 0; i < 3; i ++ )
      {
      
      material = new ColorMaterial(Math.random() * 0xFFFFFF);
        material.interactive = true;
        //material.doubleSided = true;
        //material.smooth = true;
      
      

      var p:Cube = new Cube(new MaterialsList( { front:material, back:material,left:material, right:material, top:material, bottom:material } ), 200, 50, 200, 10, 10, 10);
      
      p.y = 0;
        p.x = 250*i-1000
        p.name="plano"+i
       
        scene.addChild( p );
        nombres.push( p );
      //trace( p.name );
      }}
      
   private function createListeners():void
   {
      for ( var i:uint = 0; i < nombres.length; i ++ )
      {
        nombres[i].addEventListener( InteractiveScene3DEvent.OBJECT_CLICK, onObjectClick );
      }
            addEventListener( Event.ENTER_FRAME, onEnterFrame );
        }
      
      private function onObjectClick(est:InteractiveScene3DEvent):void
      {
      //var target:DisplayObject3D;
      var target:DisplayObject3D;
      trace(est.target.name);
      est.target.rotationX = 67 + est.target.rotationX;
      
      //este.displayObject3D
      
      }
      
      private function onEnterFrame( e:Event ):void
        {
            //GreatWhite rendering
            renderer.renderScene(scene , camera , viewport);
        }
    }
}

Por tremulousevolution

13 de clabLevel



 

firefox
Citar            
MensajeEscrito el 21 Jun 2008 08:19 pm
Me alegro que lo has conseguido.

Por Nycksan

73 de clabLevel



 

msie

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.