2008
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);
}
}
}
}
 

3 comments so far

Add Your Comment
  1. 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.

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

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