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■マウスを押している間ポインタの座標を表示
*画像をクリックすると、サンプルムービーが表示されます。
スクリプト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)」の「例」でその内容を簡単に解説しています。