jp.nium.display

2008.8.4

jp.nium.displayをちらみしたメモになります。開発中のrev1837の時点を見てフライングで書いているので、予告なしに変更され得る層を紹介しようとしているのかもしれませんし(というのも書いている最中にlistenOnStageが消えたからです!)、逆に周知のことを紹介しているのかも分かりませんが、痒いところに手が届いているあまり興奮を禁じ得ませんでした。その点ご了承下さい。

実は最近になってようやくProgressionを勉強しています。ver3からの入門です(汗)。3本柱の一つであると聞くキャストですが、今まで表示オブジェクトのサブクラス化を好んで行わない(= リンケージしないでインスタンス名つけて操作する)スタイルで制作していたという極めて個人的な理由で食わず嫌いしていたのですが、その考えはすぐに変わることになりました。

リンケージの手間を惜しむ私のような人間には、リンケージ一括設定(特に接尾辞プロファイル!)が以前から提供されていたようですし、開発予定の画面ではなんかキャストのテンプレートを自動生成してくれそうな雰囲気すら漂わせているように見えますが(気のせいでしょうか?)、もしそのようになればキャストのサブクラスを作る負担はかなり減ることになるので期待が膨らんでしまいます。さらにキャストはonCastXXXの処理中に追加したコマンドを同期化してくれるだけかと思っていたものの、実はjp.nium.display系の便利機能を継承していたことを知り、主な機能をチェックしてみようと思ったわけでした。

IEventIntegrator

removeAllListeners(completely:Boolean = false):void
restoreRemovedListeners():void
これら二つを用いて、イベントの配信停止と再開が手軽に実現できるようです。ただし、addExclusivelyEventListenerで追加された場合この限りではないようです。

IExDisplayObject

このインターフェースを実装しているクラスのインスタンスは、jp.progression.casts.*の以下の3つのパッケージ関数によって表示ツリーの階層を問わず簡単に取得できるようです。

getInstanceById(id:String):DisplayObject
表示オブジェクトにidを設定しておくと、階層問わず参照できるようです。getElementByIDみたいですね。

getInstancesByGroup(group:String, sort:Boolean = false):Array
表示オブジェクトにグループ名を設定しておくと、階層問わず集められるようです。

getInstancesByRegExp(fieldName:String, pattern:RegExp, sort:Boolean = false):Array
任意のフィールドで正規表現にマッチした表示オブジェクトを階層問わず集められるようです。例えば、ボタンごとにインスタンス名をつける代わりに以下のように参照することもできそうです。

//同一シンボルを1つしか配置しないため、クラス名からインスタンスが一意に決まる
CastButton(getInstancesByRegExp('className', /^AboutButton$/)[0])
.sceneId = aboutScene.sceneId;

追記: 先ほど試してみたところ、これらの3つのメソッドはaddChildしてステージに追加しなくても使えるみたいです。ということはid設定したら自己責任でexDisplayObject.id = null;などとしてコレクションから消さないとGCされないのかな・・?

setProperties(props:Object):DisplayObject
プロパティの一括設定を行えるようです。CastSpriteの表示アニメーション以前に行う座標などの初期化をすっきりとまとめられそうです。

ExDisplayObject

toBitmapData(transparent:Boolean = true, fillColor:uint = 0xFFFFFFFF):BitmapData
表示オブジェクトの内容をBitmapData化したものを取得します。

以上の操作は、ExLoader, ExMovieClip, ExSprite, ExTextFieldなどで利用できる感じです。このうち、コンテナ系のものであれば以下も利用できる感じです。

IExDisplayObjectContainer

children : Array
DisplayObjectContainerの子の走査は面倒でしたが、これで随分楽になりそうです。IExDisplayObjectContainerは、必ずしもインデックス値が連続している必要はないため、あらかじめ大きな値を設定しておいて最前面を確保したいときなどに便利そうです。となれば、走査するにあたってnull要素を除いた子のリストが欲しくなるでしょうが、こいつがそれを提供してくれるっぽいです。

contains(child:DisplayObject):Boolean
指定された表示オブジェクトを含むか、自身であればtrueを返します。孫、ひ孫・・とツリー全体をテストしてくれるようです。

removeAllChildren():void
全ての子を削除します。地味に便利です。

最後に、インスタンス化できるものでユニークだなと思った機能に以下があります。

ExSprite

isDragging : Boolean
startDrag()を使用中か否かを返します。

ExMovieClip

isPlaying : Boolean
ムービークリップの再生ヘッドが移動中か取得します。

repeat : Boolean
ループ再生するかを取得または設定できるようです。

switchAtPlaying():void
再生と停止を切り替えます。

ExTextField

appendTextAtCaretIndex(newText:String):void
テキストフィールドのキャレット位置に文字列を挿入できるみたいです。

displayパッケージの機能拡張は継承の苦しい裂目が見えてきて大変な部分だと想像しますが、ここまで使い勝手の優先を貫いていることに感心してしまいました。おかげで、各々の表示キャストはDisplayObjectと同一視できつつ、一方でIExDisplayObjectとしての顔も持つようです。しかし、これもProgressionのごく一部に過ぎないと思うと驚異的ですね!