ActionScript3 の Event 関連

ActionScript ではさまざまな条件をイベントとして扱う事ができます。初期状態でライブラリに存在するイベントだけでもマウスのクリックやキーボードのあるボタンが押されたかどうかなど、一通りの操作を行う事ができます。
が、例によって使い方に癖があるので、備忘録も兼ねてメモしておこうと思います。

イベントのリッスン

イベントを取り扱うクラスは、 EventDispatcher と呼ばれます。特に意識しなくとも MovieClip や Sound など大抵のクラスはこれを継承しているので、そのまま利用可能です。
もちろん、自分でクラスを定義する場合は、 EventDispatcher か、そのサブクラスを継承しないとイベントは扱えません。クラスの詳細は、 API で確認できます。

http://livedocs.adobe.com/flash/9.0_jp/ActionScriptLangRefV3/class-summary.html

さて、実際にイベントを受け取る場合、あるオブジェクトがイベントをリッスンする事を明示的に指定する必要があります。この時に利用するのが EventDispatcher.addEventListener メソッドです。

stage.addEventListener(Event.ENTER_FRAME, doSomething);

第1引数がリッスンするイベントの種類(この場合フレームが遷移したとき)、第2引数が実行されるメソッドを指定します。第2引数では無名関数も利用できます。

stage.addEventListener(Event.ENTER_FRAME, function(event:Event):void {
  trace("ゆっくりしていってね!!!");
}

実行されるメソッド側では、引数に Event クラスを指定する必要があります。また、この時 event.target 及び event.currentTarget でイベントが発生したオブジェクトを参照する事ができます。
target と currentTarget の差は currentTarget というキャンパスの上に target がたくさん乗っていて、 currentTarget はいつでもキャンパス自身を指し、 target は上に乗ったボタンや図の内でイベントを受け取った(例えば、クリックされた)ものになる、と覚えておくと便利です。

function doSomething(event:Event):void {
  trace(event.target); // イベントを受け取ったオブジェクト
  trace(event.currentTarget); // 実際にイベントを処理するオブジェクト
}

イベントのリッスンを停止する

説明に入る前に、以下のソースを 新規作成した .fla ファイルにペーストしてコンパイルしてみて下さい。

var i = 0;
stage.addEventListener(Event.ENTER_FRAME, doTrace);

function doTrace(event:Event):void {
  trace(++i);
}

これを実行すると、延々と i の値が増加しながら Flash のコンソールウインドウに出力されるはずです。ここから分かるように、一旦登録したイベントは削除しない限り残り続けてしまいます。
ENTER_FRAME のようにフレーム毎に処理を行う場合問題ないのですが、使い終わったイベントは削除しておかないとメモリの無駄遣いになる可能性があります。そのようなケースでイベントのリッスンを停止するには、 EventDispatcher.removeEventListener メソッドを使います。
先ほど同様、下のコードを .fla ファイルにペーストして、コンパイルして下さい。初回のウインドウリサイズ時のみトレースが行われるはずです。

stage.addEventListener(Event.RESIZE, doTrace);

function doTrace(event:Event):void {
  trace("ゆっくりしていってね!!!");
  stage.removeEventListener(Event.RESIZE, doTrace);
}

このように、基本的には addEventListener の add を remove に変えただけなのですが、複数のオブジェクトが doTrace メソッドを呼び出す場合などは、動的にリッスンを停止するオブジェクトを指定する必要があります。そこで登場するのが、先ほどの event.target です。

stage.addEventListener(Event.RESIZE, doTrace);

function doTrace(event:Event):void {
  trace("ゆっくりしていってね!!!");
  event.target.removeEventListener(Event.RESIZE, doTrace);
}

このように指定すれば、対象となるオブジェクトを自動で判別できます。

明示的にイベントを発生させる

EventDispatcher では、自分からイベントを発生させる事もできます。この時に利用するのが EventDispatcher.dispatchEvent メソッドです。

stage.dispatchEvent(new Event(Event.RESIZE));

例えば、上のコードなら強制的にウインドウのリサイズイベントを呼び出す事ができます。が、実際の使用時には、殆ど自分で定義したイベント、カスタムイベントを利用する事になると思います。

カスタムイベントの定義

カスタムイベント以前に、イベントそのものについて説明します。ActionScript3 では、イベントも Event クラスとして扱われます。そのため、これを継承する事でイベントに関する機能を利用する事ができます。
標準ライブラリでもこの仕組みが利用されていて、例えばよく使われるマウスによる操作のリッスンに使うのは MouseEvent というクラスで、これは Event のサブクラスです。
実際に、簡単なカスタムイベントを作成してみます。以下は MyEvent.as というファイルに保存し、 .fla ファイルと同じディレクトリに入れて下さい。

package {
   import flash.events.Event;
   public class MyEvent extends Event {
 
      public static const UHO:String = ("uho");
 
      public override function clone():Event {
         return new MyEvent(type);
      }
   }
}

この MyEvent クラスを実際に利用してみます。MyEvent.as と同じディレクトリに .fla ファイルを作成し、コードを入力してコンパイルして下さい。

addEventListener(MyEvent.UHO, doTrace);

function doTrace(event:MyEvent):void {
  trace("ゆっくりしていってね!!!");
}

stage.dispatchEvent(new MyEvent(MyEvent.UHO));

実行すると、トレースが行われたと思います。カスタムイベントについては、友人ちゅう君がまとめているのでそちらも参考にして下さい。

http://ecpplus.net/weblog/flex/447/