EventDispatcherの代行
Flash OOPの本を読んでいて知ったEventDispatcher。
自作クラス内の処理終了通知のために使用しようかと考えていましたが、他のシンプルなコードで終了を通知する機能を実装する方法があります。(Activationオブジェクト?)
例えば次のようなMainクラスとMoveクラスがあるとします。
class Main{ public function test():Void{ var move:Move = new Move(); move.start( _root.charMC ); } } class Move{ public function start( mc:MovieClip ):Void{ mc.onEnterFrame = function(){ mc._x += 10; if( mc._x < 100 ){ return; } delete mc.onEnterFrame; }; } }
ここで、Move.startメソッドの処理が全て終了したことをMainクラスで知りたい場合、EventDispatcherを用いると次のようなコードになります。
class Main{ public function test():Void{ var move:Move = new Move(); //リスナー登録 var obj:Object = new Object; obj[ Move.END_FUNC ] = function( ev:Object ){ trace( ev.mes ); }; move.addEventListener( Move.END_FUNC, obj ); move.start( _root.charMC ); } } import mx.events.EventDispatcher; class Move{ public var addEventListener :Function; public var removeEventListener:Function; private var dispatchEvent :Function; static public var END_FUNC:String = "moveEnd"; public function Move(){ EventDispatcher.initialize( this ); } public function start( mc:MovieClip ):Void{ var scope:Move = this; mc.onEnterFrame = function(){ mc._x += 10; if( mc._x < 100 ){ return; } delete mc.onEnterFrame; //終了したことを伝えるイベント配信 scope.dispatchEvent( { type:Move.END_FUNC, mes:"終了" } ); }; } }
次にEventDispatcherを用いずに終了を通知するためのシンプルなコードは次の通り。
class Main{ public function test():Void{ var move:Move = new Move(); move.moveEnd = function( ev:Object ){ trace( ev.mes ); }; move.start( _root.charMC ); } } class Move{ public var moveEnd:Function; public function start( mc:MovieClip ):Void{ var scope:Move = this; mc.onEnterFrame = function(){ mc._x += 10; if( mc._x < 100 ){ return; } delete mc.onEnterFrame; //終了を通知 scope.moveEnd( { mes:"終了" } ); }; } }
EventDispatcherでは、複数リスナー用Objectを作成して登録すれば、その複数リスナー全てに終了メッセージを伝えることができます。しかしMoveクラスの処理終了後、各リスナーで複数処理を走らせるということが目的だとするならば、一つのリスナーで終了を通知した後、複数メソッドを呼べばいいことなので、今のところ私は自作クラスの処理終了通知のためにEventDispatcherを使用する必要はないようです。
イベント配信を行う有効な例というのがきっとあると思うのですが、私の頭では思い浮かばないです。もっと本を読もう。
アクティベーションオブジェクトに関しては以下のURLに文献があるのですが、眠くなるのでまだ解読していません。
初めまして。
EventDispacherを検索してたどり着いてきました。
なるほど、こんな風にイベント終了のイベントを作ったり
できるんですね。
わかりやすい解説でかなり理解できました :)
投稿者 s_a_s_a_k_i : 2005年07月31日 16:40