2008
05.31
05.31
Olá galera!!
Esses dias estava conversando com um amigo e ele me perguntou se eu poderia ajudá-lo a entender como funciona os eventos de click, mouseOver, mouseOut, etc.. em objetos dentro do papervision3d. Sendo assim, fiz este exemplo básico ai em cima que demonstra como é simples trabalhar com o eventos da classe InteractiveScene3DEvent.
Clique nos objetos para vizualizar as ações.
Os arquivos desse exemplo podem ser baixados aqui.
/* Author: Junio Vitorino Date: 31/05/2008 Description: Interactive Objects */ package src { import caurina.transitions.Tweener; import flash.display.StageScaleMode; import flash.events.Event; import org.papervision3d.core.math.Number3D; import org.papervision3d.events.InteractiveScene3DEvent; import org.papervision3d.materials.ColorMaterial; import org.papervision3d.materials.utils.MaterialsList; import org.papervision3d.objects.DisplayObject3D; import org.papervision3d.objects.primitives.Cube; import org.papervision3d.view.BasicView; public class Main extends BasicView { private var clicado:Boolean; private var holdPos:Number3D; public function Main() { super(500, 300, true, true); init(); } private function init():void { var cont:DisplayObject3D = new DisplayObject3D(); cont.name = "root"; scene.addChild(cont); cont.z = -300; stage.scaleMode = StageScaleMode.NO_SCALE; buildPlanes() listeners() } private function buildPlanes():void { var ml:MaterialsList = new MaterialsList ( {front: new ColorMaterial(0x84aa21, 1, true), back:new ColorMaterial(0xd00000, 1, true) }); var excFaces:int = Cube.TOP + Cube.BOTTOM + Cube.LEFT + Cube.RIGHT; var _x:int = 0; var _y:int = 0; var _width:Number = 0; var columns:int = 5; for(var i:int = 0; i < 10; i++) { var obj:Cube = new Cube(ml, 200, 0, 300, 3, 3, 3, 0, excFaces); obj.name = "item" + i; obj.x = -Math.random() * -5000; obj.y = Math.random() * 5000; obj.z = Math.random() * 5000; obj.addEventListener(InteractiveScene3DEvent.OBJECT_CLICK, itemClick); _x = Math.round(215 * (i % columns)); _y = Math.round(315 * Math.floor(i / columns)); _width += 210; Tweener.addTween(obj, {x:_x, y:_y, z:0, time:.7, transition:"easeoutexpo"}); scene.getChildByName("root").addChild(obj); } scene.getChildByName("root").x = -stage.stageWidth * .5 - 150; scene.getChildByName("root").y -= 100; stage.addEventListener(Event.RESIZE, rePos); } private function rePos(e:Event):void { scene.getChildByName("root").x = -stage.stageWidth * .5 - 150; scene.getChildByName("root").y -= 100; } private function listeners():void { addEventListener(Event.ENTER_FRAME, RENDER); } private function RENDER(e:Event):void { renderer.renderScene(scene, camera, viewport, true); } private function itemClick(e:InteractiveScene3DEvent):void { if(!clicado) { off(e.currentTarget); holdPos = new Number3D(e.currentTarget.x, e.currentTarget.y, e.currentTarget.z); Tweener.addTween(e.currentTarget, {z:-610, x:(stage.stageWidth * .5)+150, y:100, time:.4, transition:"easeoutquart"}); clicado = true; Tweener.addTween(camera, {z:-1050, time:.5, transition:"easeoutexpo"}); } else { Cube(e.currentTarget).removeEventListener(InteractiveScene3DEvent.OBJECT_CLICK, itemClick); Cube(e.currentTarget).addEventListener(InteractiveScene3DEvent.OBJECT_CLICK, resetItem); Tweener.addTween(e.currentTarget, {rotationY:180, time:.4, transition:"easeoutquart"}); } } private function resetItem(e:InteractiveScene3DEvent):void { Tweener.addTween(camera, {z:-950, time:.5, transition:"easeoutquart"}); Cube(e.currentTarget).addEventListener(InteractiveScene3DEvent.OBJECT_CLICK, itemClick); Cube(e.currentTarget).removeEventListener(InteractiveScene3DEvent.OBJECT_CLICK, resetItem); Tweener.addTween(e.currentTarget, {z:holdPos.z, x:holdPos.x, y:holdPos.y, rotationY:0, time:.4, transition:"easeoutquart"}); clicado = false; on() } private function off(_obj:Object):void { for(var i:int = 0; i < scene.getChildByName("root").numChildren; i++) { scene.getChildByName("root").getChildByName("item"+i).removeEventListener(InteractiveScene3DEvent.OBJECT_CLICK, itemClick); } _obj.addEventListener(InteractiveScene3DEvent.OBJECT_CLICK, itemClick); } private function on():void { for(var i:int = 0; i < scene.getChildByName("root").numChildren; i++) { scene.getChildByName("root").getChildByName("item"+i).addEventListener(InteractiveScene3DEvent.OBJECT_CLICK, itemClick); } } } }

Esse seu demo, é muito parecido com um projeto que participei há um tempo atrás. Na época, precisávamos desenvolver um jogo-da-memória. Mas não existia nada que fosse bom o suficiente para fazer essa rotação aí.. então fizemos tudo na-mão usando flash grrrr
Gostei do código,
bom trabalho.
Não sei quanto tempo é esse post, mas me interessei muito porque estou iniciando meus projetos em paper, tentei baixar o exemplo mas não consegui, teria como disponibilizar para essa pobre criatura aqui de novo?!
tk-designer@hotmail.com
Grato desde já, Tk
Olá amigo,
Realmente este exemplo é meio velho, mas o código ainda se mantém, coisas melhoraram, mas este ainda funciona. Tudo que você precisa está no código acima, basta ter as bibliotecas do GreatWhite setadas no seu classpath.