Flashの3D表現ライブラリの1つである、Alternativa3Dに手を出してみました。
使ってるバージョンは7.5です。
今回は、マウスイベントのやりかた確認。
サンプルはこんな感じです。
マウスオーバー・マウスアウト・マウスクリックのイベントを追加してます。
ここらへんは、PV3Dより簡単かも。
以下、今回のメモ。
- マウスイベントを使う場合は、viewのinteractiveをtrueにする。
- MouseEvent3Dを使う。
以下ソースです。
package
{
import alternativa.engine3d.core.Camera3D;
import alternativa.engine3d.core.MouseEvent3D;
import alternativa.engine3d.core.Object3DContainer;
import alternativa.engine3d.core.View;
import alternativa.engine3d.materials.FillMaterial;
import alternativa.engine3d.primitives.Box;
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageQuality;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.filters.GlowFilter;
import org.libspark.betweenas3.BetweenAS3;
import org.libspark.betweenas3.easing.Bounce;
[SWF(backgroundColor=0x000000)]
public class Main extends Sprite
{
private static const RADIAN:Number = Math.PI/180;
private static const FOCUS:Number = 800;
private var rootContainer:Object3DContainer;
private var camera:Camera3D;
private var view:View;
private var box:Box;
private var count:int;
public function Main()
{
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
stage.quality = StageQuality.HIGH;
stage.frameRate = 40;
// ベースとなるコンテナ。
rootContainer = new Object3DContainer();
// カメラの初期化 (PV3Dでいうフリーカメラみたいなの)。
camera = rootContainer.addChild(new Camera3D) as Camera3D;
camera.z = -800;
camera.x = camera.y = 0;
// ビューポート (View is DisplayObject)
view = new View(stage.stageWidth, stage.stageHeight);
view.logoAlign = StageAlign.TOP_LEFT;
view.logoHorizontalMargin = 80;
camera.view = addChild(view) as View;
// イベントを使う場合は、viewのinteractiveをtrueにする。
view.interactive = true;
// デバッグ情報を表示する場合は記述
camera.diagramAlign = StageAlign.TOP_LEFT;
addChild(camera.diagram);
// 箱を作成
count = 0;
box = new Box(130, 130, 130);
box.setMaterialToAllFaces(new FillMaterial(0x770000, 1, 7, 0x220000));
rootContainer.addChild(box);
// イベントを追加
box.addEventListener(MouseEvent3D.MOUSE_OVER, onMouseOver);
box.addEventListener(MouseEvent3D.MOUSE_OUT, onMouseOut);
box.addEventListener(MouseEvent3D.CLICK, onMouseClick);
addEventListener(Event.ENTER_FRAME, onFrame);
stage.addEventListener(Event.RESIZE, onResize);
}
// マウスオーバー
private function onMouseOver(e:MouseEvent3D):void
{
view.buttonMode = true;
box.filters = [new GlowFilter(0xFFAA77, 1, 15, 15, 3)];
}
// マウスアウト
private function onMouseOut(e:MouseEvent3D):void
{
view.buttonMode = false;
box.filters = [];
}
// マウスクリック
private function onMouseClick(e:MouseEvent3D):void
{
if(count%2 == 0) BetweenAS3.tween(box,{scaleX:1.5, scaleY:1.5, scaleZ:1.5},null, 0.7, Bounce.easeOut).play();
else BetweenAS3.tween(box,{scaleX:1, scaleY:1, scaleZ:1},null, 0.7, Bounce.easeOut).play();
count ++;
}
private function onResize(e:Event):void
{
view.width = stage.stageWidth;
view.height = stage.stageHeight;
}
private function onFrame(e:Event):void
{
box.rotationX += RADIAN;
box.rotationY += RADIAN;
camera.render();
}
}
}
