Adobe Flash非公式テクニカルノート Starlingフレームワークで表示リストの子オブジェクトにイベントが起こったことを伝える
説明DisplayObjectContainer.broadcastEvent()とDisplayObjectContainer.broadcastEventWith()メソッドは、自らの表示リストのすべての階層に属する子オブジェクト(DisplayObject)にイベントを送ります。すると、子オブジェクトのそのイベントに登録されたリスナーが呼出されます。つまり、子オブジェクトにイベントを伝え、子オブジェクトのイベントリスナーを間接的に呼出すメソッドです。その点で、直接リスナーにイベントを配信する EventDispatcher.dispatchEvent()やEventDispatcher.dispatchEventWith()メソッドとは異なります。 DisplayObjectContainer.broadcastEvent()メソッドの引数には、送るEventオブジェクトを渡します。ただし、バブリングするEventオブジェクト(Event.bubblesプロパティがtrue)は送れません[*1]。 DisplayObjectContainerオブジェクト.broadcastEvent(Eventオブジェクト) DisplayObjectContainer.broadcastEventWith()イベントは、内部的にEventオブジェクトを使い回します。そのため、Eventオブジェクトは予めつくらずに、イベント名の文字列を第1引数に渡します。Eventクラスがすでにつくられたオブジェクトを蓄えていれば設定し直して使い回し、なければ新たなオブジェクトをつくります。第2引数には、Eventオブジェクトに加えて送りたい任意の値が渡せます(デフォルト値はnull)。 DisplayObjectContainerオブジェクト.broadcastEventWith(イベント名, 任意の値) 第2引数に渡した値は、EventオブジェクトのEvent.dataプロパティとして定められます。イベントリスナーでその値をどのように取出すかについては、「StarlingフレームワークのEventDispatcher.dispatchEventWith()メソッドと新しいイベント配信」をご参照ください。 どちらのメソッドも、引数に渡されたイベントのリスナーをもつ子オブジェクトだけにイベントが送られます(内部的に、イベントリスナーがあるかどうかをひとつひとつ確かめています)。また、メソッドを呼出したDisplayObjectContainerインスタンス自身も、そのリスナーがあればイベントを受取ります。
例Starlingフレームワークは、内部的にStarlingオブジェクトがFlash PlayerからEvent.ENTER_FRAMEイベントを受取ると、Starling.advanceTime()メソッドを呼出します。そして、このメソッドはStageオブジェクトの表示リストにEvent.ENTER_FRAMEイベントを配信します。具体的には、Starling.advanceTime()から呼出すStage.advanceTime()メソッドが、以下のように実装されています。 【StarlingフレームワークにおけるEvent.ENTER_FRAMEイベントの流れ】
Stage.advanceTime()メソッドはDisplayObjectContainer.broadcastEvent()メソッドで、自らの表示リストのすべての階層に属する子オブジェクトにEvent.ENTER_FRAMEイベント(EnterFrameEventオブジェクト)を送っています。なお、reset()メソッドはEventクラスに内部的に定められていて、すでにあるEventオブジェクトを初期化し、第3引数の値はEvent.dataプロパティに与えます。 実装DisplayObjectContainer.broadcastEventWith()メソッドがEventオブジェクトを使い回す仕組みについて、簡単にご説明します。DisplayObjectContainer.broadcastEventWith()メソッドは、つぎのように実装されています。
Eventクラスの静的メソッドfromPool()とtoPool()は、Eventオブジェクトを使い回すためのメソッドです。fromPool()メソッドは、Eventクラスに蓄えられたオブジェクトがあればそれを設定し直し、なければ新たなEventオブジェクトを定められた引数でつくって返します。toPool()メソッドは、EventオブジェクトをEventクラスの静的プロパティ(Eventベース型のVectorオブジェクト)に蓄えます。イベントは、DisplayObjectContainer.broadcastEvent()メソッドで送っています。 作成者: 野中文雄 Copyright © 2001-2013 Fumio Nonaka. All rights reserved. |
|||||||||||||||||||||||||||||||||||||||