■イベント発生とイベントリスナーの仕組み
ActionScript3.0からイベント処理の仕組みが変わりました。「クリックで移動」などのようにイベントを受けて処理を実行したい場合には、受けたいイベントの種類と実行したいメソッドの組み合わせを、addEventListener()メソッドを使ってイベントを受けることができるクラスにリスナー登録して待っています。イベントが発生すると登録しておいたメソッドが呼ばれます。この一連の流れを図にすると次のようになります。
この仕組みは、「誰か訪ねてきたら、ここに連絡してください」と受付に登録しておくようなものです。すると受付は「誰が何時訪ねてきたか」というイベントオブジェクトを連絡してくれるというわけです。
fig05-01-01p206 イベント発生を受ける仕組み。
簡単な例をメインのタイムラインのフレームアクションで確認してみましょう。次の例はステージのインスタンスball_mcをクリックしたならばonClick()メソッドを実行するスクリプトです。イベントの種類はMouseEvent.CLICK、イベント発生で呼び出すイベントハンドラ名はonClickです。
[:sample:] clickeventSample1.fla
例:
fig04-01-01 インスタンスをクリックすると出力ウインドウに「Clickしました」と出力されます。
ActionScript3.0からイベント処理の仕組みが変わりました。「クリックで移動」などのようにイベントを受けて処理を実行したい場合には、受けたいイベントの種類と実行したいメソッドの組み合わせを、addEventListener()メソッドを使ってイベントを受けることができるクラスにリスナー登録して待っています。イベントが発生すると登録しておいたメソッドが呼ばれます。この一連の流れを図にすると次のようになります。
この仕組みは、「誰か訪ねてきたら、ここに連絡してください」と受付に登録しておくようなものです。すると受付は「誰が何時訪ねてきたか」というイベントオブジェクトを連絡してくれるというわけです。
fig05-01-01p206 イベント発生を受ける仕組み。
簡単な例をメインのタイムラインのフレームアクションで確認してみましょう。次の例はステージのインスタンスball_mcをクリックしたならばonClick()メソッドを実行するスクリプトです。イベントの種類はMouseEvent.CLICK、イベント発生で呼び出すイベントハンドラ名はonClickです。
[:sample:] clickeventSample1.fla
例:
//CLICKイベントのリスナーに登録 ball_mc.addEventListener(MouseEvent.CLICK, onClick); //イベントを受けて実行 function onClick(event:MouseEvent):void { trace("Clickしました"); }
fig04-01-01 インスタンスをクリックすると出力ウインドウに「Clickしました」と出力されます。
これをクラス定義すると次のClickEventSample2クラスのようになります。
ClickEventSample2クラスではクリックするムービークリップインスタンスをコンストラクタの引数で受け取りmy_mcに入れています。クリックイベントを処理するイベントリスナーに登録すればインスタンスはボタンになりますが、マウスカーソルは通常のままです。そこで、buttonModeプロパティをtrueにし、インスタンスにロールオーバーしたならば指カーソルになるようにします。
なお、フレームアクションでは必要ありませんが、クラス定義する場合にはMouseEventクラスとMovieClipクラスのインポートを忘れないようにします。
[:sample:] ClickEventSample2.as
例:インスタンスにクリックイベントを設定するClickEventSample2クラス
ステージにball_mcを作り、メインのタイムラインのフレームアクションには次のスクリプトを書いてテストします。
[:sample:] clickeventSample2.fla
例:メインのタイムラインのフレームアクション
fig04-01-01 インスタンスをクリックすると出力ウインドウに「Clickしました」と出力されます。ロールオーバーすると指カーソルになります。
ところで、イベントリスナーが呼び出すonClick(event:MouseEvent)メソッドには引数が指定してあります。ClickEventSample2クラスでは送られてくる引数eventを使っていませんが、必ず引数を指定しなければなりません。引数として送られてくるeventはMouseEventイベントオブジェクトであり、クリックした座標や同時に押されていたモディファイキーの状態などのプロパティをもっています。
ClickEventSample2クラスのonClick()メソッドに次のように1行追加すると、eventオブジェクトのプロパティの値を調べることができます。
例:イベントオブジェクトのプロパティを調べる
ClickEventSample2クラスではクリックするムービークリップインスタンスをコンストラクタの引数で受け取りmy_mcに入れています。クリックイベントを処理するイベントリスナーに登録すればインスタンスはボタンになりますが、マウスカーソルは通常のままです。そこで、buttonModeプロパティをtrueにし、インスタンスにロールオーバーしたならば指カーソルになるようにします。
なお、フレームアクションでは必要ありませんが、クラス定義する場合にはMouseEventクラスとMovieClipクラスのインポートを忘れないようにします。
[:sample:] ClickEventSample2.as
例:インスタンスにクリックイベントを設定するClickEventSample2クラス
package { import flash.events.MouseEvent; import flash.display.MovieClip; public class ClickEventSample2 { var my_mc:MovieClip; //コンストラクタ function ClickEventSample2(mc:MovieClip) { my_mc = mc; //指カーソルにする my_mc.buttonMode = true; //CLICKイベントのリスナーに登録 my_mc.addEventListener(MouseEvent.CLICK, onClick); } //イベントを受けて実行 function onClick(event:MouseEvent):void { trace("Clickしました"); } } }
ステージにball_mcを作り、メインのタイムラインのフレームアクションには次のスクリプトを書いてテストします。
[:sample:] clickeventSample2.fla
例:メインのタイムラインのフレームアクション
var ballObj:ClickEventSample2 = new ClickEventSample2(ball_mc);
fig04-01-01 インスタンスをクリックすると出力ウインドウに「Clickしました」と出力されます。ロールオーバーすると指カーソルになります。
ところで、イベントリスナーが呼び出すonClick(event:MouseEvent)メソッドには引数が指定してあります。ClickEventSample2クラスでは送られてくる引数eventを使っていませんが、必ず引数を指定しなければなりません。引数として送られてくるeventはMouseEventイベントオブジェクトであり、クリックした座標や同時に押されていたモディファイキーの状態などのプロパティをもっています。
ClickEventSample2クラスのonClick()メソッドに次のように1行追加すると、eventオブジェクトのプロパティの値を調べることができます。
例:イベントオブジェクトのプロパティを調べる
function onClick(event:MouseEvent):void { trace("Clickしました"); trace(event.target, event.shiftKey, event.stageX, event.stageY); }