OnEnterFrameBeaconクラスを使う [Edit]

Flash MX 2004およびFlash 8には、OnEnterFrameBeaconというクラスがあります。このクラスのOnEnterFrameBeacon.init()というメソッドを呼出すと、MovieClipにリスナーオブジェクトが登録でき,MovieClip.onEnterFrameイベントを受取れるようになります。

その場合の利点としては、第1にMovieClip以外のオブジェクトを使ったスクリプトで、MovieClipインスタンスをつくらずにMovieClip.onEnterFrameイベントが受取れることです。第2に、複数のfunction(関数)を組合わせてMovieClip.onEnterFrameハンドラで処理をしたいとき、MovieClipインスタンスをいくつも使いたくないという場合も考えられます。本稿では、第1の場合のサンプルスクリプトをご紹介します。

1. OnEnterFrameBeacon.init()メソッド
OnEnterFrameBeacon.init()メソッドは、つぎのように呼出します。

import mx.transitions.OnEnterFrameBeacon;
OnEnterFrameBeacon.init();

OnEnterFrameBeaconクラスは、パッケージというディレクトリの中に格納されています。その場合、スクリプトの冒頭でimportステートメントにより、そのパッケージのパスを宣言する必要があります。OnEnterFrameBeaconクラスの場合は、mx.transitions.OnEnterFrameBeaconになります。

パッケージパスを宣言したら、後はOnEnterFrameBeacon.init()メソッドを呼出すだけです。このとき、ターゲットのOnEnterFrameBeaconは、クラス名をそのまま指定します(OnEnterFrameBeaconのインスタンスは作成しません)。

この2行のステートメントにより、MovieClipクラスにはaddListener()removeListenerのふたつのメソッドが追加され、リスナーオブジェクトを登録すればMovieClip.onEnerFrameイベントが受取れるようになります[*1]。

2. リスナーでMovieClip.onEnerFrameイベントを受取る
以下のスクリプトは、マウスボタンを押している間、ポインタのxy座標をTextFieldに表示します(図001)。MovieClipインスタンスを用いず、ひとつのリスナーオブジェクトですべての処理を行います(スクリプト001)。

図001■マウスを押している間ポインタの座標を表示
FN051009-001.gif
*画像をクリックすると、サンプルムービーが表示されます。

スクリプト001■マウスポインタの座標をTextFieldで表示するリスナーオブジェクト
// タイムライン: _root
// 第1フレームアクション
// OnEnterFrameBeaconクラスの使用
import mx.transitions.OnEnterFrameBeacon;
OnEnterFrameBeacon.init();

// リスナーオブジェクト作成
var oListener:Object = new Object();
oListener.nOffset = 7; // マウスポインタとTextFieldの座標間隔
// Mouseクラスへのリスナー設定
Mouse.addListener(oListener);
oListener.onMouseDown = function() {
  // TextField作成
  this.target_txt = xCreateTextField();
  // MovieClipにリスナー登録
  MovieClip.addListener(this);
};
oListener.onMouseUp = function() {
  // TextField削除
  this.target_txt.removeTextField();
  // MovieClipからリスナー削除
  MovieClip.removeListener(this);
};
// リスナーオブジェクトへのonEnterFrameイベントハンドラ設定
oListener.onEnterFrame = xSetTextField;
// TextField作成
function xCreateTextField() {
  var nDepth:Number = _root.getNextHighestDepth();
  var field_str:String = "my"+nDepth+"_txt";
  _root.createTextField(field_str, nDepth, 0, 0, 0, 0);
  var _txt:TextField = _root[field_str];
  _txt.autoSize = true;
  _txt.selectable = false;
  return _txt;
}
// TextFieldの位置および表示テキストの設定
function xSetTextField() {
  var nMouseX:Number = _root._xmouse;
  var nMouseY:Number = _root._ymouse;
  this.target_txt._x = nMouseX+this.nOffset;
  this.target_txt._y = nMouseY+this.nOffset;
  this.target_txt.text = [nMouseX, nMouseY].toString();
}

作成したリスナーオブジェクトoListenerは、Mouseクラスに登録して、マウスイベントを受取ります。Mouse.onMouseDownイベントで、ポインタ座標表示用のTextFieldインスタンスを作成し、MovieClipクラスにリスナーオブジェクトを登録します。

リスナーオブジェクトには、MovieClip.onEnterFrameハンドラも設定してあります。ハンドラ内では、TextFieldインスタンスの位置をマウスポインタに追随させるとともに、そのテキストにマウスポインタのxy座標を入力します。

マウスボタンを放すと、リスナーオブジェクトに設定したMouse.onMouseUpイベントハンドラが呼出されます。ハンドラ内では、TextFieldインスタンスを消去するとともに、リスナーオブジェクトをMovieClipクラスから削除します。

MovieClipインスタンスを使った場合の処理とは異なり、リスナーのMovieClip.onEnterFrameハンドラを削除する必要はありません。MovieClipクラスのリスナーからオブジェクトを削除すれば、MovieClip.onEnterFrameイベントは受取らないからです。
_____
[*1] OnEnterFrameBeaconクラスは,「BroadcasterMXクラス (API)」の「例」でその内容を簡単に解説しています。

その他の記事