サイトトップ

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

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

BroadcasterMXクラス (API)

ID: FN0510004 Product: Flash

Platform: All
Version: Flash MX 2004 and above

*このクラスは、ドキュメント化されていません。

ActionSciptクラス名: mx.transitions.BroadcasterMX

シンタックス[*1]
public static initialize (oTarget:Object[, bDontCreateArray:Boolean]) : Void

[訳者注*1] 従来のシンタックスの記述にしたがえば、つぎのとおりです。なお、戻り値はありません。

BroadcasterMX.initialize(oTraget[, bDontCreateArray])

引数
oTarget:Object - BroadcasterMXのAPI(プロパティとメソッド)を実装するターゲットとなるオブジェクト。クラスにAPIを実装するには、クラスのObject.prototypeプロパティを渡します。

bDontCreateArray:Boolean [省略可能] - リスナーオブジェクトが格納される配列プロパティの要否を指定するブーリアン(論理)値。trueを指定すると、プロパティは作成されません。それ以外の値を指定するか引数を省略すれば、プロパティに配列が作成されます。

[*2] ただし、リスナーを格納する配列のプロパティが存在しないと、BroadcasterMXのAPIは使用できません。したがって、この引数bDontCreateArraytrueに指定した場合には、別途プロパティへの配列作成の処理を用意する必要があると思われます。

説明
ターゲットのオブジェクトに、イベントリスナー・配信が利用できるためのAPI(プロパティとメソッド)を実装します。BroadcasterMX.initialize()メソッドの引数に指定したオブジェクトは、下表のプロパティ(表001)やメソッド(表002)を備え、そのオブジェクトからpublicメソッドが呼出せるようになります[*3][*4]。

表001■BroadcasterMXのプロパティ
プロパティ 説明
BroadcasterMX._listeners リスナーオブジェクトを格納する配列。このプロパティは外部からは直接利用せず、下記のメソッドを通してアクセスします。

表002■BroadcasterMXのメソッド
メソッド 説明
BroadcasterMX.addListener(oListener:Object):Number イベントの配信対象とするリスナーオブジェクトを、格納用の配列プロパティに登録します。戻り値は、リスナーオブジェクトを格納した配列の長さ(リスナーオブジェクトの数)です。
BroadcasterMX.broadcastMessage(message_str:String):Void 格納用の配列プロパティに登録されたリスナーオブジェクトすべてに、文字列で指定したイベントを配信します。戻り値は、ありません。
BroadcasterMX.removeListener(oListener:Object):Boolean イベントの配信対象とするリスナーオブジェクトを、格納用の配列プロパティから削除します。指定したオブジェクトが存在すればtrue、存在しなかったらfalseを返します。

[*3] したがって、BroadcasterMXクラスで直接使うのは、BroadcasterMX.initialize()メソッドのみです。表001および002のメソッドやクラスは、BroadcasterMX.initialize()メソッドの引数に指定したオブジェクトに実装され、そのオブジェクトのプロパティおよびメソッドとして使用されます。

[*4] クラスでBroadcasterMXのAPIを使用する場合には、3つのメソッドをpublic(指定は省略可)とし、リスナーオブジェクトを格納する配列のプロパティはprivateで指定します(public/privateのアクセス制限については、「ActionScriptリファレンスガイド」を参照)。たとえば、mx.transitions.Tweenクラスは、メンバをつぎのように宣言しています(スクリプト001)。なお、OnEnterFrameBeaconクラスについては、後述の「例」をご参照ください。

スクリプト001■Tweenクラス

import mx.transitions.BroadcasterMX;
import mx.transitions.OnEnterFrameBeacon;

class mx.transitions.Tween {

  #include "Version.as"

  static var __initBeacon = OnEnterFrameBeacon.init();
  static var __initBroadcaster = BroadcasterMX.initialize (Tween.prototype, true);
  // ...[中略]...
  public var addListener:Function;
  public var removeListener:Function;
  public var broadcastMessage:Function;
  // ...[中略]...
  private var _listeners:Array;


つぎのクラスサンプル(スクリプト002)は、mx.transitions.BroadcasterMXクラスの実際の内容(実装)です。MovieClipに静的メソッド[*5]として、BroadcasterMXのAPIを実装しています。若干スクリプトの記述に不統一な部分が見られるので、青字で修正を加えました(もとのステートメントは、コメントアウトしたグレー表示の部分です)[*6]。

mx.transitions.OnEnterFrameBeaconクラスは、ただひとつの静的メソッドOnEnterFrameBeacon.init()のみで構成されます。引数なしのこのメソッドを呼出すと、MovieClipクラスに静的なメソッドとしてMovieClip.addListener()やMovieClip.removeListener()、MovieClip.broadcastMessage()メソッド(およびMovieClip._listenersプロパティ)が実装されます。そこで、リスナーオブジェクトをMovieClip.addListenre()メソッドでMovieClipクラスに登録すれば、MovieClip.onEnterFrameイベントがリスナーオブジェクトに配信されます。

スクリプト002■OnEnterFrameBeaconクラス

import mx.transitions.BroadcasterMX;

class mx.transitions.OnEnterFrameBeacon {

  #include "Version.as"

  static function init ():Void {
    // var gmc = _global.MovieClip;
    if (!_root.__OnEnterFrameBeacon) {
      // BroadcasterMX.initialize (gmc);
      BroadcasterMX.initialize (_global.MovieClip);
      var mc:MovieClip = _root.createEmptyMovieClip ("__OnEnterFrameBeacon", 9876);
      mc.onEnterFrame = function () { _global.MovieClip.broadcastMessage ("onEnterFrame"); };
    }
  }
};

ポイントだけ、簡単に解説します。MovieClip.onEnterFrameイベントは、MovieClipインスタンスの実体がないと受取ることができません(MovieClipクラスを継承しても、イベントは配信されません)。そのため、_root.__OnEnterFrameBeaconを、実体のインスタンスとして作成します。深度の9876は、ユーザーの使用により上書きされないような値を、任意に選んだものと考えられます。

OnEnterFrameBeacon.init()メソッドは、1度呼出せば足ります。その確認は、_root.__OnEnterFrameBeaconインスタンスの存否により行っています。MovieClipクラスの静的なメソッドとしてBroadcasterMXのAPIを実装するため、BroadcasterMX.initialize()メソッドの引数は、MovieClip.prototypeではなく[*7]、MovieClipクラス(コンストラクタ)を指定しています。

MovieClip.onEnterFrameイベントは、_root.__OnEnterFrameBeaconインスタンスが受取ります。ですから、イベントハンドラメソッドはこのインスタンスに設定します。しかし、リスナーにイベントを配信するBroadcasterMX.broadcastMessageメソッドは、MovieClipクラスの静的メソッドとして実装されます。したがって、MovieClip.onEnterFrameイベントハンドラのコールバック関数内から、MovieClip.broadcastMessage()メソッドを、イベント名の"onEnterFrame"を引数として呼出しています。

[*5] 静的メソッドについては,「インスタンスとクラスのメンバ」をご参照ください。

[*6] もとのスクリプトでも,動作にことさら問題はありません。厳密な型指定がされていない部分を補ったことと、MovieClipクラスの参照がローカル変数と_global参照で統一されていない点を修正しました。ローカル変数はアクセスが速い利点はあるものの、スピードが問題になる処理内容とは考えにくいため、見やすさを優先して_global参照に統一しました。MovieClipという識別子をオーバーライドして使うことさえなければ、_globalプロパティなしでも問題ありません。

[*7] クラスのObject.prototypeオブジェクトを引数に指定すると、BroadcasterMXのAPIがインスタンスのプロパティ・メソッドとして実装されます。したがって、イベントリスナー・配信の処理は、クラスの各インスタンスごとに操作できることになります。

Player
ActionScript 2.0/Flash Player 7以降。

_____

作成者: 野中文雄
作成日: 2005年10月9日


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