Updated at: 2014-08-06

システムの全体観

krewFramework の構造

krewFramework が動作しているときの各コンポーネントの関係は、以下のようになっています。


最も土台にあるものが GameDirector です。 これはゲーム中に 1 つ存在し、常に 1 つの Scene を持ちます。 Scene が終了したとき、次の Scene に切り替える役目を担います。

Scene は、多層の StageLayer を持ちます。 StageLayer は画面の表示の前後関係や、タッチ可能の有無をレイヤー単位で管理するために使われます。 この StageLayer に Actor が乗ります。

Actor = starling.display.Sprite

Actor は Starling Framework の Sprite クラスを継承しています。 実際のところ、StageLayer に Actor が乗っている状態は、 Starling の Display Tree (シーングラフ)が作られている状態と同等です。

Actor は Sprite ですが、krewFramework のインタフェースを用いている限りは addChild / removeChild などを自分で書く必要はありません。

View を別に分ける設計も妥当ですが、今回は割り切ってこのようにしました

Resource の管理

krewFramework は Scene 単位でリソースを管理します。 Scene に必要なアセットのファイルパスを記述しておくと、 krewFramework は ResourceManager にリソースを保持します。

Global スコープや複数の Scene をまとめたスコープでもリソースを持つことができますが、 最小のスコープは Scene 単位です

Actor は自分に必要なリソースが読み込まれている前提で、 自身のインタフェースを用いてリソースを取得します。

// Actor 内で
var image:Image = getImage("resource_name");

Scene が終わって次の Scene に遷移するとき、krewFramework は自動的に Scene のリソースを解放します。

Actor 同士のメッセージング

Actor は StageLayer に乗っている間、他の Actor にメッセージを送ったり、 逆に特定のメッセージを受け取ったりすることができます。 (いわゆる Publisher / Subscriber 型の通信です。)

krewFramework 上に static に 1 つ存在する NotificationService が、 これを処理しています。Actor は以下のようにメッセージ(= イベント)を待ち構えることができます。

// メッセージのリスナー登録
listen("Event_from_others", _myCallbackFunction);

listen を呼ぶと、Actor がこのメッセージの Observer として NotificationService に登録されます。 また、以下のようにメッセージを発信することができます。

// 他の Actor 達にメッセージを送る
sendMessage("Event_from_me");

sendMessage を呼ぶと、メッセージは一時的に NotificationService に保持されます。 各ゲームループの最後に、そのメッセージを listen している Actor 達に向けてメッセージが送られます。

Actor が破棄されるとき、krewFramework はリスナーの登録解除などを自動で行います。