Progression4のちょっと変わったシーン活用法
Progression4で便利なところはシーン構造を手軽に作れることです。
が、シーンの中にロジックが集中しすぎると結局わけわかんないことになっちゃったりします。
どのシーン内の機能が増えてきて、どの機能まで含めるかという設計とか意味的なところで迷ったりすることがあります。
たとえばシーン移動が終わってから外部サイトへの遷移したいときや、シーンを出る演出が終わってから(ログなどの)通信処理やExternalInterfaceの操作が必要な場合です。(普通はあんまりないかもですが)
そういう場合、似たような通信処理があちこちにあったり、通信を意識したシーン移動処理をかかなければいけなかったり、切り分けがうまくいってない感じできもち悪いなと思ったりします。
そこで考えたのが以下の2つ。
冗長な部分の処理を、そもそもシーンとして切り出してしまうという方法です。
外部サイトもシーンの1つとして定義してしまうという感じです。
GoToScene(navigateToURL用)
それぞれコンストラクタにURLRequestなりコールしたいJSの関数名を入れて定義しておきルートシーンかどこかにaddSceneしておきます。必要なときは普通にGotoコマンドでそれらのシーンIDへ遷移し、移動したタイミングで処理が行われます。
package {
	import flash.net.navigateToURL;
	import flash.net.URLRequest;
	import jp.nium.external.Browser;
	import jp.progression.casts.*;
	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.commands.*;
	import jp.progression.events.*;
	import jp.progression.loader.*;
	import jp.progression.*;
	import jp.progression.scenes.*;
	
	/*======================================================================*//**
	 * GotoScene クラス
	 */
	public class GotoScene extends SceneObject {
		private var _req:URLRequest;
		private var _window:String;
		
		// コンストラクタ
		public function GotoScene( req:URLRequest, window:String = "_blank", name:String = null, initObject:Object = null ) {
			super( name, initObject );
			_req = req;
			_window = window;
		}
		protected override function atSceneLoad():void {
			addCommand(
			);
		}
		protected override function atSceneInit():void {
			addCommand(
				new NavigateToURL(_req, _window)
			);
		}
		protected override function atSceneGoto():void {
			addCommand(
			);
		}
		protected override function atSceneUnload():void {
			addCommand(
			);
		}
	}
}
これにより、もといたシーンは自分の終了処理のみ意識すればよく、通信を待ったりする必要がなくなります。またそもそも通信かどうか関係なく、通常通りGotoコマンドでシーン遷移させるだけでよいので切り分けとしてはスッキリかけます。
var gotoTopScene :SceneObject = new GotoScene( new URLRequest("/index.html"), "_self", "gotoTop");
addScene(gotoTopScene);
//--------------------
//利用時
new Goto("/index/gotoTop").execute();
FuncScene(ExternalInterface用)
次に主にExternalInterfaceを使ってJSで外部ページに連動させるために作ったFuncSceneです。
ブログーパーツのような別のSWFと連携したり演出後に自身を消したりすることが容易にできるようになります。
package {
	import jp.progression.casts.*;
	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.commands.*;
	import jp.progression.events.*;
	import jp.progression.loader.*;
	import jp.progression.*;
	import jp.progression.scenes.*;
	
	/*======================================================================*//**
	 * FuncScene クラス
	 */
	public class FuncScene extends SceneObject {
		private var _func:Func;
		
		// コンストラクタ
		public function FuncScene( func:Function, arg:Array = null, name:String = null, initObject:Object = null ) {
			super( name, initObject );
			_func = new Func( func, arg );
		}
		protected override function atSceneLoad():void {
			addCommand(
			);
		}
		protected override function atSceneInit():void {
			addCommand(
				_func
			);
		}
		protected override function atSceneGoto():void {
			addCommand(
			);
		}
		protected override function atSceneUnload():void {
			addCommand(
			);
		}
	}
}使うときはこんなかんじ。
var closeScene:SceneObject = new FuncScene( ExternalInterface.call, ["close_swf"], "close" ); addScene(closeScene); //利用時 new Goto( "/index/close" ).execute();
ErrorScene
最後にError画面を表示させるためのシーン。
先程の2つとは少し違いますが、エラーもあちこちに必要でいてもとのシーンにいちいち置いておくのが冗長だなと感じることが多い画面です。
通常のWebサイトではあまり必要ないかもしれませんが、APIなど外部リソースを利用するコンテンツでは有効だと思います。
こちらもやはりシーンの切り分けができることがメリットとなります。
ただしエラーのバリエーションが多い場合、かえって大変になったり、情報の引渡しがしづらかったり融通が聞かないので、場面によっては、という事にはなりそうです。
エラー画面を上にだすというより、エラー画面に遷移させてしまえばいいと思えば楽になる場合はあるはずです。参考になれば幸いです。
package {
	import jp.co.kao.kawatsuku.passport.display.ErrorPage;
	import jp.progression.casts.*;
	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.commands.*;
	import jp.progression.events.*;
	import jp.progression.loader.*;
	import jp.progression.*;
	import jp.progression.scenes.*;
	
	/*======================================================================*//**
	 * ErrorScene クラス
	 */
	public class ErrorScene extends SceneObject {
		private var _page:ErrorPage;
		
		// コンストラクタ
		public function ErrorScene( initObject:Object = null ) {
			super( "error", initObject );
			
			_page = new ErrorPage();
		}
		protected override function atSceneLoad():void {
			addCommand(
			);
		}
		protected override function atSceneInit():void {
			addCommand(
				new AddChild( container, _page )
			);
		}
		protected override function atSceneGoto():void {
			addCommand(
				new RemoveChild( container, _page )
			);
		}
		protected override function atSceneUnload():void {
			addCommand(
			);
		}
	}
}コードとしては普通にページをかぶせるだけですけど。

