DiffuseとAbsorb - sipo/gipo GitHub Wiki
staticに何かを記録するのは有名なアンチパターンです。また、Singletonを使いすぎるのも同様に危ない兆候です。
とはいえ、どこからでもアクセスしたいデータやインスタンスは常に使いたくなります。インスタンスを引数で渡していると、長いバケツリレーになってしまい、コードが分かりにくく、面倒になります。
そこでGipoにはNodeが作る木構造を利用して、範囲を限定してアクセスが可能なインスタンスを設定することができます。diffuseでインスタンスを登録し、absorbでそれを取得します。
また、インターフェースを組み合わせることでDIコンテナのように活用することができます。
インスタンスの登録
tool.diffuse(logicStatus, LogicStatus);
diffuseを使用するには、preparationイベントで提供されるtool引数を使用します。diffuseはこのタイミングでしか使用できません。これは、子のGearHolderが生成された時にdiffuseが終了されているかどうかわからなくなるのを防ぐためです。
diffuseメソッドには、対象となるインスタンスと、キーとなる型を登録します。この型を元にabsorbを行うことができます。
インスタンスの取得
メタデータによる取得
@:absorb
private var logicStatus:LogicStatus;
@:absorb
メタデータタグを指定することで、変数に値を自動的に入れることができます。private変数でも問題ありません。
この値は、Nodeが親に追加された直後に追加されるため、コンストラクタでは参照できません。preparationやrunタイミング以降で使用してください。
関数による取得
ローカル変数など局所的な使用をしたい場合は、関数指定で任意に取得することができます。
var view:ViewForLogic = gear.absorb(ViewForLogic);
取得できる範囲
absorbは、diffuseを行ったNodeを含む、それ以下のツリーでのみ可能になります。範囲外からは取得することができません。
Enumによる登録
同じ型を複数diffuseする可能性がある場合は、EnumをキーとしてDiffuseすることができます。
tool.diffuseWithKey(gameLayer, PilotViewDiffuseKey.GameLayer);
@:absorbWithKey(PilotViewDiffuseKey.GameLayer)
private var layer:Sprite;