2009/12/02 | 0:47 am

Progression でクロスフェード

久々に Progression 使ってサイト構築したときの Tips

Progression でのシーンの移動の際、通常は _onGoto() と _onInit() 内にある addCommand() の2つの処理を待つのですが、
どーしてもクロスフェードが必要になった場合の処理。
SerialList を static な変数として生成しておいて、都度アクセスするのが一番効率良いやり方らしいス。
(自分確認ではなく開発者本人がおっしゃってたので、大丈夫かと。)

やり方はいたって簡単。
IndexScene と ChildScene の _onInit と _onGoto の addCommand() での処理で静的な変数として生成した SerialList を呼ぶ。
(注:そのままだと addCommand は SerialList のためクロスフェードしないので、ParallelList にしておく必要アリ)

-IndexScene.as


public static var customCommands:SerialList = new SerialList();	// ← これ!

public var page:IndexPage;

/**
* コンストラクタ
*/
public function IndexScene() {
	addScene( new ChildScene( "child" ) );

	page = new IndexPage();
	page.alpha = 0;
}

/**
* シーンオブジェクトが目的地だった場合に、到達した瞬間に送出されます。
* このイベント処理の実行中には、addCommand() メソッド、及び insertCommand() メソッドによるコマンドの同期処理が行えます。
*/
protected override function _onInit():void {
	// 実行したいコマンドを登録します。
	addCommand(
		new ParallelList( null,
			IndexScene.customCommands,	// ← ここで実行。初回は中身が空なので何も起きませぬ。
			new SerialList( null,
				new AddChild( progression.container, page ),
				new DoTweener( page, { alpha:1, time:2 } )
			)
		),
		function():void {
			IndexScene.customCommands.clearCommand( true );		// ← クロスフェード後に中身をクリアしとく
		}
	);
}

/**
* シーンオブジェクトが出発地だった場合に、移動を開始した瞬間に送出されます。
* このイベント処理の実行中には、addCommand() メソッド、及び insertCommand() メソッドによるコマンドの同期処理が行えます。
*/
protected override function _onGoto():void {
	IndexScene.customCommands.addCommand(	// ← ここでは RemoveChild しないで、customCommands に登録だけしておく
		new DoTweener( page, { alpha:0, time:2 } ),
		new RemoveChild( progression.container, page )
	);

	// 実行したいコマンドを登録します。
	addCommand(
	);
}

下階層のシーンでも基本的に処理は一緒。

-ChildScene.as

/**
* シーンオブジェクトが目的地だった場合に、到達した瞬間に送出されます。
* このイベント処理の実行中には、addCommand() メソッド、及び insertCommand() メソッドによるコマンドの同期処理が行えます。
*/
protected override function _onInit():void {
	// 実行したいコマンドを登録します。
	addCommand(
		new ParallelList( null,
			IndexScene.customCommands,	// ← ここで実行。IndexScene の _onGoto() で設定したコマンドが同時に実行されます。
			new SerialList( null,
				new AddChild( progression.container, page ),
				new DoTweener( page, { alpha:1, time:2 } )
			)
		),
		function():void {
			IndexScene.customCommands.clearCommand( true );		// ← クロスフェード後に中身をちゃんとクリアしとく
		}
	);
}

/**
* シーンオブジェクトが出発地だった場合に、移動を開始した瞬間に送出されます。
* このイベント処理の実行中には、addCommand() メソッド、及び insertCommand() メソッドによるコマンドの同期処理が行えます。
*/
protected override function _onGoto():void {
	IndexScene.customCommands.addCommand(	// ← このページの処理を登録
		new DoTweener( page, { alpha:0, time:2 } ),
		new RemoveChild( progression.container, page )
	);

	// 実行したいコマンドを登録します。
	addCommand(
	);
}

シーンの _onGoto() では、コマンドの登録だけして、
実際の処理は、遷移先のシーンの _onInit(() で実行させるって行程です。
この処理を全部のシーンで実行させるようにしておけば、全部のページ遷移でクロスフェードになります。

COMMENT

POSTED

jam





JUN NAKAJIMA
Tokyo, Japan.
member of Onawatobi.
contact@brooklyn.jp