progressionとpapervision3dの連携について考えてみる

秋だ!シルバーウィークだ!お勉強だ!
シングルトンを使ってprogressionとpapervision3dを連携させると
結構管理が楽そうなのでSingletonPv3d.asクラスをつくってみた。

3D空間を扱うときはあまり(?)3D空間に急に物体が現れることはないと思ったので
今回はシングルトンクラス内でオブジェクトを生成してみた。
なぜかクリック処理までシングルトン内にあるのでやっぱりオブジェクトの生成は
progressionでやるほうがよいのかな。
なにわともあれもう少し小奇麗にしたい。

使い方は
progressionのIndexScenシーンなりで
SingletonPv3d.getInstance();
_onLoad や _onInit内でaddChildしてあげればよいだけ。

あとレンダリングはコンストラクタで行うと
マウスカーソルがチカチカする;
どうしてかな。。。。?

サンプル

ソースコードはこんな感じ。

今きづいたけど、シーン移動中にPlaneをクリックすると
クリックしたシーンに移動してないな。
やっぱりprogression側でカメラの移動したほうが綺麗かも。。
うーん、でもねむいのでまたにする。

SingletonPv3d.as

	public class SingletonPv3d extends Sprite
	{
		static private var _instance:SingletonPv3d;
		private var plane:Plane;
		private var basicBiew:BasicView;
		private var world:DisplayObject3D;
		private var planeCollection:/*DisplayObject3D*/Array;
		private var progression:Progression;
		
		public function SingletonPv3d(singletonEnforcer:SingletonEnforcer) 
		{
			if (singletonEnforcer == null) {
				throw Error("++++SingletonPv3d ERROR!!++++");
			}
		}
		
		public static function getInstance():SingletonPv3d
		{
			if (!SingletonPv3d._instance)
			{
				SingletonPv3d._instance = new SingletonPv3d(new SingletonEnforcer());
				_instance.drawWorld();
				
			}
			return SingletonPv3d._instance;
		}
		
		public function aaaa():void {
			drawWorld();
		}
		
		private function drawWorld():void
		{
			~~~省略~~~
			//--------------------------------------------------------------------------
			//  basic biewの作成
			//--------------------------------------------------------------------------
			basicBiew = new BasicView(500,500,true,true,"Target");
			addChild(basicBiew);
			
			//  カメラの設定
			//  オブジェクトの作成などを行う
			~~~省略~~~
			
			/// イベント処理
			basicBiew.addEventListener(Event.ADDED_TO_STAGE, onStage);
			
		}
		
		/// 配置待ち
		private function onStage(e:Event):void 
		{
			progression = getProgressionById("index");
			basicBiew.removeEventListener(Event.ADDED_TO_STAGE, onStage);
		}
		
		/// basicBiew
		public function getBasicBiew():BasicView{return basicBiew;}
		
		/// world
		public function getWorld():DisplayObject3D{return world;}
		
		/// camera
		public function getCamera():CameraObject3D{return basicBiew.camera;}
		
		/// objectの取得
		public function getCollection():Array{return planeCollection;}
		
		public function startRendering():void{basicBiew.startRendering();}
		
	}
}

class SingletonEnforcer { }

IndexScene.as

/**
 * コンストラクタ
 */
public function IndexScene() {
	// ブラウザ同期時に出力したいタイトルを設定します。
	//title = "MyProject_2";
	
	/// シーンを作成
	var n:int = 40;
	for (var i:int = 1; i < n; i++) 
	{
		var scene:MyScene = new MyScene(String(i));
		addScene(scene);
	}
	
	
	/// シングルトンクラスでPV3Dの3Dシーンを作成
	singletonPv3d = SingletonPv3d.getInstance();
	
}


/**
 * シーン移動時に目的地がシーンオブジェクト自身もしくは子階層だった場合に、階層が変更された瞬間に送出されます。
 * このイベント処理の実行中には、addCommand() メソッド、及び insertCommand() メソッドによるコマンドの同期処理が行えます。
 */
protected override function _onLoad():void {
	// 実行したいコマンドを登録します。
	
	/// PV3DをprogressionにAddChildする
	progression.container.addChild(singletonPv3d);
	
	/// PV3Dのレンダリングを開始
	singletonPv3d.startRendering();
	
	addCommand(
		
	);
}

最後になりますが、ソースコード一式あげておきます。
MySceneクラスにBallとか変なクラスあるので削除してお使いください。
サンプル sauce一式