Flashvars モジュール化

FlashVars は ActionScript 3.0 からオブジェクトとして処理出来るので、汎用的にモデルクラスにオブジェクト突っ込もうと思ってモジュール作成。

色んなやり方があるとは思うけど、FlashVars の可否に関わらず、view で Event を dispatch しておいて、controller がある場合はそれを model クラスルートクラスが格納する仕組み。これだとすべての view クラスが model の参照を持っている前提で必要な時だけすべての view 系のクラスからいつでもオブジェクトを取得出来るので、key(FlashVars の変数名)さえ渡せばどこでも使用出来る。基本の view が dispatch して controller がそれを listen して model を操作っていう MVC パターンでのモジュール化。

サンプルはドキュメントクラス Main でそこで MVC を作成している例。
(CF ってのは convexstyle framework の略なので気にせず!)

package {
	public class Main extends CFComponentMC {
		import controller.CFController;
		import flash.events.Event;
		import model.CFModel;
		import view.CFView;
		import view.events.FlashvarsEvent;
		public function Main() {
			this.addEventListener(Event.ADDED_TO_STAGE, onInit, false, 0, true);
		}
		private function onInit(evt:Event):void {
			var m:CFModel      = new CFModel();
			var v:CFView         = new CFModel();
			var c:CFController = new CFModel();
			// この FlashvarsEvent を FlashvarsController が listen している
			v.dispatchEvent(new FlashvarsEvent(FlashvarsEvent.SAVE, this.stage.loaderInfo.parameters));
		}
	}
}
package {
	public class FlashvarsController extends CFController {
		import controller.CFController;
		import view.events.FlashvarsEvent;
		public function FlashvarsController() {
			super();
			this._view.addEventListener(FlashvarsEvent.SAVE, handleFlashVarsSave, false, 0, true);
		}
		private function handleFlashVarsSave(evt:FlashvarsEvent):void {
			this._model.flashvars = evt.flashvars;
		}
	}
}

個人的にはこのやり方が気持ちいいな。
取得の際は、key(ここでは test)で取得するだけなので、どの View クラスでも気兼ねなく使える。

if(!ObjectUtil.isNull(this._model.flashvars["test"])) {
    // do action
}

flashvars サンプル画像

ちなみに今まで少し曖昧だったのが FlashVars の取得方法。
preloader.swf が main.swf を読み込む場合、よくブログとかには LoaderInfo(this.root.loaderInfo).parameters とか this.root.loaderInfo.parameters とか書いてあるが、上記の図の用に preloader.swf が main.swf を読み込んで main.swf から loaderInfo オブジェクトを取得しようとすると null になる。当然ながら root ってそのコンテンツの表示ツリーのトップを意味するので、ここでは main.swf のトップ。loaderInfo は大元の swf の情報を取得するものなので、今回は表示オブジェクトのルートである preloader.swf の loaderInfo が flashVars を格納するのでずれてしまう。

loaderInfo はもともと DisplayObject のプロパティなので、各 swf に共通でシングルトンである DisplayObject のサブクラスstage オブジェクトの loaderInfo プロパティから取得する形がいいですね。this.stage.loaderInfo.parameters。

ページの一番上へ移動

トラックバック

この記事へのトラックバック URL は下記の通りです。
http://www.convexstyle.net/mt/mt-tb.cgi/64

コメント (1)

タロ:

CF っていったら ColdFusion だよ、間違いなく。

コメントの投稿

初めて投稿される方のコメントは管理者の承認が必要となります。ご了承ください。