3. ActionScriptのシンタックス/3.9 イベントリスナー
3.9 イベントリスナー
イベントリスナーへの登録
マウスクリックがあったらどうする、キー入力があったらどうするというようにイベントに応じてスクリプトを実行するには、イベントを受け止めるイベントハンドラを設定します。しかし、イベントハンドラを作ってもそれを設定したインスタンスにイベントメッセージが送られなければ意味がありません。
たとえば、ビルインクラスのMovieClipクラスはマウスクリックイベントのonMouseUpやonMouseDown、あるいはonPressといったイベントが送られるので、これを受けるイベントハンドラを設定すればマウスクリックに応じたスクリプトを実行できます。ムービークリップインスタンスのmy_mcならば、次のイベントハンドラを設定すればマウスクリックで回転します。ステージのどこをクリックしてもonMouseDownイベントがすべてのムービークリップインスタンスに送られるので、インスタンスをクリックしなくてかまいません。
sample→evetlistener1.fla
//マウスイベントを受けてインスタンスを回転させる
my_mc.onMouseDown = function(){
this._rotation += 10;
}
ところが、次のようにObjectクラスでmyObjインスタンスを作ってonMouseDownイベントハンドラを設定しても、myObjインスタンスへはマウスイベントが送信されないので応答しません。
sample→evetlistener2.fla
//ObjectクラスのmyObjインスタンスを作る
myObj = new Object();
//イベントハンドラを設定する
myObj.onMouseDown = function(){
trace("クリックがありました");
}
myObjインスタンスにマウスクリックのイベントが送信されるようにするには、addListener()メソッドを使ってMouseクラスのリスナーに登録します。リスナーへの登録は、「サブスクライブ(subscribe)」とも呼ばれます。
//myObjをMouseクラスのイベントリスナーに登録する
Mouse.addListener(myObj);
同様に、キー入力イベントに応答するようにするには、Keyクラスのイベントリスナーに登録します。
sample→evetlistener3.fla
//ObjectクラスのmyObjインスタンスを作る
myObj = new Object();
//イベントハンドラを設定する
myObj.onKeyDown = function(){
trace("キー入力がありました");
}
//myObjをMouseクラスのイベントリスナーに登録する
Key.addListener (myObj);
note:
キー入力イベントをムービープレビューでテストする際には、制御メニューの[キーボードショートカットを無効]をチェックしておく必要があります。
MovieClipクラスにもキー入力イベントは送信されません。そこで、ムービークリップのインスタンスをキー入力で操作するにはインスタンスをKeyクラスのイベントリスナーに登録します。次の例では、矢印キーを押すとキーに応じた方向にインスタンスの座標が移動します。
sample→evetlistener4.fla
フレームアクション:
//ball_mcインスタンスにキー入力のイベントハンドラを設定
ball_mc.onKeyDown = function(){
switch (Key.getCode()){
case Key.LEFT: //←キー
this._x -= 10;
break;
case Key.RIGHT: //→キー
this._x += 10;
break;
case Key.UP: //↑キー
this._y -= 10;
break;
case Key.DOWN: //↓キー
this._y += 10;
break;
}
}
//Keyクラスのイベントリスナーに登録する
Key.addListener(ball_mc);
イベントリスナーからの消去
逆にイベントリスナーの登録を消去するには、removeListener()メソッドを実行します。
//MouseクラスのイベントリスナーからmyObjを消去する
Mouse.removeListener (myObj);
//Keyクラスのイベントリスナーからball_mcを消去する
Key.removeListener(ball_mc);
イベントリスナーを設定できるクラス
このようなイベントリスナーを設定できるクラスには次のようなものがあります。それぞれのクラスによって発生するイベントは違います。
Keyクラスのリスナーが受け取るイベント
onKeyDown キーが押された。
onKeyUp 押されたキーが上がった。
Mouseクラスのリスナーが受け取るイベント
onMouseDown マウスボタンが押された。
onMouseUp 押されたマウスボタンが上がった。
onMouseMove マウスカーソルが動いた。
onMouseWheel マウスホイールが回転した。
MovieClipLoaderクラスのリスナーが受け取るイベント
onLoadComplete データの読み込みが完了した。
onLoadError データの読み込みを失敗した。
onLoadInit 読み込んだムービークリップの先頭フレームのアクションが実行された。
onLoadProgress データ読み込み中(ディスクへ書き込むタイミングで発生)。
onLoadStart データ読み込みを開始した。
Selectionクラスのリスナーが受け取るイベント
onSetFocus フォーカスが移動tした。
Stageクラスのリスナーが受け取るイベント
onResize swfの縦横サイズ(ステージサイズ)が変更された。
TextFieldクラスのリスナーが受け取るイベント
onChanged テキストフィールドのテキストが変更された。
onScroller テキストフィールドがスクロールした。
note:
V2コンポーネントでもイベントリスナーを利用してイベントを処理できます。ただし、V2コンポーネントでは、addEventListener(イベント名, リスナーオブジェクト)の書式でリスナーを登録します。
listenerObject.eventName = function(evtObj){
// ここにコードを入力
};
componentInstance.addEventListener("eventName", listenerObject);