Progressionが使えるようになりたいメモ寄り道その1_Papervision3D


Progressionでスライドショー作りの寄り道で、ProgressionでPapervision3Dを使ってみたくなったメモです。

[フロー]

・シーンにPapervision3Dのページ(CastSpriteクラスのサブクラス)を読み込む。

・Cubeを生成

・回転し続けるアニメーションにする

・キューブをロールオーバーするとTweenerで大きくなる

・キューブをロールアウトすると元の大きさに戻る

以下のソース(要Papervision3D GreateWhite、Tweener、Progression)はページ部分なので、シーンにnew AddChild(progression.container,new PagePv3dTop())というコマンドを追加などをしてください。

package bao_pv3d.pages 
{
	import flash.events.Event;

	//import Tweener
	import caurina.transitions.Tweener;
	
	//import Progression
	import jp.progression.casts.*;
	import jp.progression.commands.*;
	import jp.progression.events.*;
	import jp.progression.loader.*;
	import jp.progression.*;
	import jp.progression.scenes.*;
	
	
	//import papervision3d
	import org.papervision3d.view.Viewport3D;
	import org.papervision3d.scenes.Scene3D;
	import org.papervision3d.cameras.Camera3D;
	import org.papervision3d.render.BasicRenderEngine;
	import org.papervision3d.objects.primitives.Cube;
	import org.papervision3d.materials.utils.MaterialsList;
	import org.papervision3d.materials.ColorMaterial;
	import org.papervision3d.events.InteractiveScene3DEvent;
	
	public class PagePv3dTop extends CastSprite 
	{
		
		/*======================================================================*//**
		 * コンストラクタ
		 */
		public function PagePv3dTop( initObject:Object = null ) 
		{
			super( initObject );
		}
		private var scene:Scene3D;
		private var viewport:Viewport3D;
		private var render:BasicRenderEngine;
		private var camera:Camera3D;
		private var cube:Cube;
		
		/*======================================================================*//**
		protected override function _onCastAdded():void 
		{
			init_Pv3d();
		}
		
		//papervision関連
		private function init_Pv3d():void
		{
			viewport = new Viewport3D(stage.stageWidth, stage.stageHeight, false,true);
			scene = new Scene3D();
			render = new BasicRenderEngine();
			camera = new Camera3D();
			
			addChild(viewport);
			
			//Cubeの設定
			var allMaterial:ColorMaterial = new ColorMaterial(0xff0000);
			allMaterial.interactive = true;
			var materialList:MaterialsList=new MaterialsList({all:allMaterial});
				
			cube = new Cube(materialList,100,100,100,4,4,4);
			cube.z = -400;
			
			scene.addChild(cube)
			
			//カメラの設定
			camera.focus = 600;
			camera.zoom = 1;
			
			
			//マウスイベント
			cube.addEventListener(InteractiveScene3DEvent.OBJECT_OVER, rollOverHandler);
			cube.addEventListener(InteractiveScene3DEvent.OBJECT_OUT, rollOutHandler);
			
			
			//レンダリング
			stage.addEventListener(Event.ENTER_FRAME, enterframeHandler);
		}
		
		private function enterframeHandler(evt:Event):void
		{
			
			cube.pitch(3);
			cube.yaw(5);
			
			//レンダリング
			render.renderScene(scene, camera, viewport);
		}
		
		private function rollOverHandler(evt:InteractiveScene3DEvent=null):void
		{
			Tweener.addTween(cube, { time:2, scale:2} );
		}
		private function rollOutHandler(evt:InteractiveScene3DEvent=null):void
		{
			Tweener.addTween(cube, { time:2, scale:1 } );
		}
	}
}

以前からの仕様なのか、初めて知ったことをメモ。

生成したオブジェクトでマウスイベントを使いたい場合、

・ViewPort3Dクラスの第4引数をtrueにする

viewport = new Viewport3D(stage.stageWidth, stage.stageHeight, false,true);

・Materialクラスのinteractiveプロパティをtrueにする

var allMaterial:ColorMaterial = new ColorMaterial(0xff0000);
allMaterial.interactive = true;

・InteractiveScene3DEventを使う

cube.addEventListener(InteractiveScene3DEvent.OBJECT_OVER, rollOverHandler);

・FreeCameraクラスもなくなったらしい。

とりあえず気づいたのはそんな感じです。

以下が結果。

http://bao-bao.net/bao_bao_blog/080925progression/

う~~む。いつものことながらおかしい。

なぜロールオーバーしたら、Event.ENTER_FRAMEが止まるのか・・・・

これは、Progressionを使用しなくても起こってしまったので、僕の書いたコードがおかしいのだと思うけど、、

どこがおかしいんだろ・・・・。

あ、あまりProgressionが関係なかった・・・・

次は、もっと連動させたメモを書きたいです。


■関連記事