Starling の新しいバージョンが公開されています。 (Download Starling 1.2)
主要な変更点は以下の通りです。
- パフォーマンスの最適化
- 最大で 50 % 高速化を実現。ベンチマークでは iPad 1 上で 690 → 1080 オブジェクト表示
- 一時オブジェクトを生成する記述の削減
- イベント機能の拡張
- Stage3D Constrained モードに対応
- Intel GMA でも GPU 描画を利用可能に
- Constraind モードが標準、コンストラクタで Baselineに変更が可能
- Away3D や Flare3D と統合
- 3D ゲームの 2D インターフェース作成に利用できる
- 統計情報に描画呼び出しの回数を追加
- 表示位置の指定も starling.showStatsAt() を使って簡単に
- skewX と skewY を使った傾きの変更
上から 2 つ目の 「イベント機能の拡張」 は、効率よく且つ柔軟にイベントを利用できるように API が変更された、というものです。以下、詳細をご紹介します。
拡張されたイベント機能
Starling 1.2 のイベント機能には、以下の 3 つの変更が行われました。
- dispatchEventWith によるイベントオブジェクトの再利用 (新規作成が不要)
- Event クラスに data 属性を追加 (サブクラス化しなくてもデータを保持させられる)
- イベントハンドラの引数の数が 0 から 2 まで可変 (イベントオブジェクトが不要な場合は引数無しで OK)
それぞれ、具体的なコードを紹介します。
まず、最初は、新しい dispachEventWith() メソッドです。このメソッドの特徴は、引数に、イベントオブジェクトではなく、イベントオブジェクトのコンストラクタへの引数を直接指定できることです。
object.dispatchEventWith(Event.TRIGGERED, true);
通常のイベントの発行と比べると、違いがわかりやすいかもです。
object.dispatchEvent(new Event(Event.TRIGGERED, true));
dispachEventWith() では、メソッドの呼び出し毎に新しい Event オブジェクトを必要としません。その分、処理が効率化されます。既に生成済みの Event オブジェクトが存在する場合、Sarling はそれを自動的に再利用します。
但し、このメソッドは Event のサブクラスを利用したい場合には使えません。
そこで、2 つ目の変更点が登場します。
新しい Event クラスは data という属性を持ちます。型は Object です。そのため、データを渡すだけの目的でサブクラスを定義する必要がなくなります。
この機能を利用する場合は、dispachEventWith() の 3 つ目の引数に data 属性に設定したいデータを指定します。
dispatchEventWith("eventType", true, "customData");
明示的に Event オブジェクトを生成する場合であれば、以下の様なコードを書くことになります。効率を考えると、実際に利用することは無いと思いますが、いちおう。
var event:Event = new Event("eventType", true); event.data = "customString"; dispatchEvent(event);
上のサンプルコードを見ると、実行効率だけでなく、コーディングの量も減っているのが分かるかと思います。
この変更に、イベントを受け取る側でも対応したのが 3 つ目の変更です。
まず、Starling 1.2 のイベントハンドラは、引数の指定が必須ではありません。そのため、イベントが発生したことだけわかれば良い場合は以下のように書くことが出来ます。
function onEvent():void { // ここに必要な処理を記述 }
更に、Event オブジェクトの data 属性の値が必要な場合、それを2 つ目の引数として受け取ることが出来ます。
function onEvent(event:Event, data:String):void { trace(data); }
もちろん、以前のバージョンでも、以下のように記述すれば良いだけの話ではあります。
function onEvent(event:Event):void { trace(event.data); }
ですが、具体的な例を見ると、コードが分かりやすくなる気もしてきます。
// EnterFrame イベントの例 addEventListener(Event.ENTER_FRAME, onEnterFrame); function onEnterFrame(event:Event, passedTime:Number):void { // passedTime を直接扱える } // KeyDown イベントの例 addEventListener(KeyboardEvent.KEY_DOWN, onKey); function onKey(event:Event, keyCode:uint):void { // keyCode の値を直接参照できる }
上のどちらの例も、event.data としてデータを受け取るより理解しやすい感じがします。もちろん、イベントの発行時に、ちゃんとデータが指定されている場合に限りますが。
コメントする