サイトトップ

Director Flash 書籍 業務内容 プロフィール

Adobe Flash非公式テクニカルノート

Starlingフレームワークで表示リストの子オブジェクトにイベントが起こったことを伝える

ID: FN1301007 Platform: All Version: CS6/ActionScript 3.0 Runtime: Flash Player 11/AIR 3.0

DisplayObjectContainerクラス
パッケージ starling.display
継承 DisplayObjectContainer → DisplayObject → EventDispatcher → Object
broadcastEvent()メソッド
文法 public function broadcastEvent(event:Event):void
概要 インスタンスの表示リストに属するすべての階層の子オブジェクトに、イベントが起こったことを伝える。その結果、子オブジェクトのそのイベントに登録されたリスナーが呼出される。ただし、バブリングするイベントは送れない。
引数

event:Event − 子オブジェクトに発生を伝えるべきEventオブジェクト。

戻り値 なし。
broadcastEventWith()メソッド
文法 public function broadcastEventWith(type:String, data:Object = null):void
概要 インスタンスの表示リストに属するすべての階層の子オブジェクトに、イベントが起こったことを伝える。イベントは第1引数に名前の文字列で定める。第2引数にはイベントオブジェクトに加えて送りたい値が渡せる。すると、子オブジェクトのそのイベントに登録されたリスナーが呼出される。なお、配信されるEventオブジェクトは、内部的に使い回される。
引数

type:String − イベントを定める文字列。配信されるEventオブジェクトのEvent.typeプロパティに納められる。

data:Object − Eventオブジェクトに加えて送る任意の値。Event.dataプロパティとして定められる。デフォルト値はnull

戻り値 なし。

説明

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インスタンス自身も、そのリスナーがあればイベントを受取ります。

[*1]「バブリング」というのは、イベントが表示リストの親インスタンスに遡って送られることです。たとえば、TouchEventオブジェクトは、Event.bubblesプロパティがデフォルトではtrueに定められていますので、マウスイベントは表示リストの親インスタンスも受取れます。なお、定義済みActionScript 3.0のマウスイベントについては、「マウスイベントMouseEvent.MOUSE_OVERとMouseEvent.ROLL_OVERの違い」02「イベントのバブリング」をご参照ください。


Starlingフレームワークは、内部的にStarlingオブジェクトがFlash PlayerからEvent.ENTER_FRAMEイベントを受取ると、Starling.advanceTime()メソッドを呼出します。そして、このメソッドはStageオブジェクトの表示リストにEvent.ENTER_FRAMEイベントを配信します。具体的には、Starling.advanceTime()から呼出すStage.advanceTime()メソッドが、以下のように実装されています。

【StarlingフレームワークにおけるEvent.ENTER_FRAMEイベントの流れ】
Flash Player
ENTER_FRAME →
Starlingオブジェクト
advanceTime() →
Stageオブジェクト
advanceTime() → broadcastEvent() →
子オブジェクト
(DisplayObject)
dispatchEvent() →
イベントリスナー
(Function)
ENTER_FRAME

private var mEnterFrameEvent:EnterFrameEvent = new EnterFrameEvent(Event.ENTER_FRAME, 0.0);

public function advanceTime(passedTime:Number):void {
  mEnterFrameEvent.reset(Event.ENTER_FRAME, false, passedTime);
  broadcastEvent(mEnterFrameEvent);
}

Stage.advanceTime()メソッドはDisplayObjectContainer.broadcastEvent()メソッドで、自らの表示リストのすべての階層に属する子オブジェクトにEvent.ENTER_FRAMEイベント(EnterFrameEventオブジェクト)を送っています。なお、reset()メソッドはEventクラスに内部的に定められていて、すでにあるEventオブジェクトを初期化し、第3引数の値はEvent.dataプロパティに与えます。


実装

DisplayObjectContainer.broadcastEventWith()メソッドがEventオブジェクトを使い回す仕組みについて、簡単にご説明します。DisplayObjectContainer.broadcastEventWith()メソッドは、つぎのように実装されています。

public function broadcastEventWith(type:String, data:Object = null):void {
  var event:Event = Event.fromPool(type, false, data);
  broadcastEvent(event);
  Event.toPool(event);
}

Eventクラスの静的メソッドfromPool()とtoPool()は、Eventオブジェクトを使い回すためのメソッドです。fromPool()メソッドは、Eventクラスに蓄えられたオブジェクトがあればそれを設定し直し、なければ新たなEventオブジェクトを定められた引数でつくって返します。toPool()メソッドは、EventオブジェクトをEventクラスの静的プロパティ(Eventベース型のVectorオブジェクト)に蓄えます。イベントは、DisplayObjectContainer.broadcastEvent()メソッドで送っています。



作成者: 野中文雄
作成日: 2013年1月22日


Copyright © 2001-2013 Fumio Nonaka.  All rights reserved.