F-site のセミナーに行ってきました(3)
2007/11/13 21:11 - AS3.0
F-site セミナー「そろそろ…、ActionScript 3.0で行かナイト!」の第3部「イベントを制する者、ActionScript 3.0 を制す」の復習の第3回目です。
三番目のサンプルは AS3.0 による ReleaseOutside の実装の話。
このサンプルでは、赤い部分でマウスダウンした後、そのまま赤い部分でマウスアップすると Release の表示が、赤い部分以外でマウスアップすると ReleaseOutside の表示がされます。
ちなみに野中先生のサイトには、このサンプルに該当する記事が以前から載っていて、そのコードをパクって AqButton などという自作クラスを作ったりしたこともありました。
そのときは深く考えずにコードを写経しただけでしたが、今回のセミナーでの説明を聞いて、なぜこういうコーディングになるのかという理由を初めて理解しました。
塞がっていた目が開いたような気分です。 仕組みを理解せずにうわべだけなぞるというのは実に愚かな行為ですね。 恥ずかしいことです。
この処理は以下のような流れになっています。
- ボタンとなる Sprite にマウスダウンのイベント監視リスナーを登録する。
sprt1.addEventListener( MouseEvent.MOUSE_DOWN , press );
- マウスダウンのイベント発生時にマウスアップのイベント監視リスナーを登録する。
マウスアップ監視リスナーは、ボタンとする Sprite 自身(1)と Stage(2) との2箇所に、それぞれ登録する。
ボタンとなる Sprite 自身に登録するイベントハンドラは release、Stage に登録するイベントハンドラは releaseOutside になる。
private function press( e:MouseEvent ):void { sprt1.addEventListener( …… (1) MouseEvent.MOUSE_UP , release ); stage.addEventListener( …… (2) MouseEvent.MOUSE_UP , releaseOutside ); }
- マウスアップのイベントが発生した場合、その場所がボタンの Sprite 上でならば、二つあるマウスアップイベントハンドラのうち、ボタン自身に登録した release のイベントハンドラが優先して起動、そうでない場合は ReleaseOutside のイベントハンドラが起動する。
ということのようです。
監視範囲が異なるイベントリスナーを二つ用意することで、if 文なしで分岐判定ができるようになるということだそうです。
今回、新しく得た知識を元に、AqButton を書き直してみようかと思います。
次回は最終回。自分なりのまとめです。
シリーズ