DoExecutor

  • 2010 年 8月 31 日
  • kosuke

Progression 4 で追加されたコマンドにDoExecutorがあります。
このコマンドはその名の通り指定したExecutorObjectを実行出来るのですが、便利そうなケースがあったので記録しておきます。

  • トップページは、直下に子シーンを持つ。
  • 子シーンは背景イメージを変更する。
  • トップページでは子シーンのいずれかの背景イメージを表示する。

ぎゅっと簡略した形ですがギャラリーコンテンツなんかでありそうなケース。

子シーンはこんな感じです。シーンに到達したら背景イメージを追加するだけ。

package{
 
	import flash.display.Bitmap;
 
	import jp.progression.commands.Prop;
	import jp.progression.commands.display.*;
	import jp.progression.scenes.SceneObject;
 
	public class ChildScene extends SceneObject{
 
		public function ChildScene(name:String=null, initObject:Object=null){
			super(name, initObject);
		}
 
		public var bmp:Bitmap;	//背景イメージ
 
		protected override function atSceneLoad():void{
			//※確認用、シーンパスを表示
			var indexScene:IndexScene	= parent as IndexScene;
			addCommand(
				new Prop( indexScene.field, { text:sceneId.path } )
			);
		}
 
		//背景イメージ追加
		protected override function atSceneInit():void{
			addCommand(
				new AddChildAt( container, bmp, 0 )
			);
		}
 
		//背景イメージ削除
		protected override function atSceneUnload():void{
			addCommand(
				new RemoveChild( container, bmp )
			);
		}
 
	}
}

トップページはこちら。トップページでは背景イメージをランダムに選んで表示したいのですが、背景イメージの表示は子シーンにも記述があります。なのでこれをDoExecutorコマンドで動かしてしまおうという魂胆。

package{
 
	import flash.display.Bitmap;
	import flash.text.*;
 
	import jp.nipx.debug.btn.Btn;
	import jp.progression.casts.*;
	import jp.progression.commands.*;
	import jp.progression.commands.display.*;
	import jp.progression.commands.lists.*;
	import jp.progression.commands.managers.*;
	import jp.progression.commands.media.*;
	import jp.progression.commands.net.*;
	import jp.progression.commands.tweens.*;
	import jp.progression.data.*;
	import jp.progression.events.*;
	import jp.progression.executors.*;
	import jp.progression.scenes.*;
 
	public class IndexScene extends SceneObject{
 
		public function IndexScene(){
			var btn:Btn;
			btn = new Btn( { label:"Index", sceneId:new SceneId( "/index" ), x:5, y:225 } );
			container.addChild( btn );
			btn	= new Btn( { label:"1", sceneId:new SceneId( "/index/1" ), x:btn.x + 5 + btn.width, y:225 } );
			container.addChild( btn );
			btn	= new Btn( { label:"2", sceneId:new SceneId( "/index/2" ), x:btn.x + 5 + btn.width, y:225 } );
			container.addChild( btn );
			btn	= new Btn( { label:"3", sceneId:new SceneId( "/index/3" ), x:btn.x + 5 + btn.width, y:225 } );
			container.addChild( btn );
 
			addScene( new ChildScene( "1", { bmp:new Bitmap( new Img1( 250,250 ) ) } ) ) as ChildScene;
			addScene( new ChildScene( "2", { bmp:new Bitmap( new Img2( 250,250 ) ) } ) ) as ChildScene;
			addScene( new ChildScene( "3", { bmp:new Bitmap( new Img3( 250,250 ) ) } ) ) as ChildScene;
 
			field	= new TextField();
			field.defaultTextFormat	= new TextFormat( "_ゴシック", 10, 0x333333 );
			field.x = 5;
			container.addChild( field );
		}
 
		public var field:TextField;
 
		protected override function atSceneInit():void{
			//子シーンをランダムに選ぶ
			var i:Number	= Math.round( numScenes * Math.random() );
			i = ( i == numScenes ) ? 0 : i;
			var scene:SceneObject	= getSceneAt( i );
 
			addCommand(
				new Prop( field, { text:sceneId.path } ),
				//子シーンexecutorを動かす、シーン到着時のイベントを送信
				new DoExecutor( scene.executor, new SceneEvent( SceneEvent.SCENE_INIT ) )
			);
		}
 
		protected override function atSceneGoto():void{
			addCommand(
				new RemoveChildAt( container, 0 )
			);
		}
 
 
	}
}

DoExecutorのサンプル

こんな形で使うと似たような処理をいくつものSceneObjectに書くようなことを減らせることもありそうですね。
ここでは、もともとSceneObjectに実装されているイベントでExecutorObjectを動かしていますが、独自のイベントでExecutorObjectを動かすことも可能です。

このあたりExecutorObjectってなに?ってところから、解りやすく書かれている記事を見つけました。
Progression 4 の DoExecutorコマンドを使い倒す! 

DoExecutorコマンドは、動かしたExecutorObjectの処理でもコマンドシークエンスが有効ってところがとても便利ですね。

“DoExecutor” に コメントはありません

コメントをどうぞ