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 )
);
}
}
} |
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 )
);
}
}
} |
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の処理でもコマンドシークエンスが有効ってところがとても便利ですね。