Alternativa3Dをやる その5-マウスイベント

Filed under 3D, Alternativa3D, AS3



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

Post a Comment

Your email is never published nor shared.