この記事のURL

http://www.dango-itimi.com/blog/archives/2005/000676.html


FLASH tips 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に文献があるのですが、眠くなるのでまだ解読していません。

http://faces.bascule.co.jp/private_static.html

[ FLASH ] [ tips ] 投稿者 siratama : 2005年04月05日 19:36

トラックバック

http://www.dango-itimi.com/blog/mt-tb.cgi/642

コメント

初めまして。
EventDispacherを検索してたどり着いてきました。

なるほど、こんな風にイベント終了のイベントを作ったり
できるんですね。
わかりやすい解説でかなり理解できました :)

投稿者 s_a_s_a_k_i : 2005年07月31日 16:40

>s_a_s_a_k_iさん

どうも初めまして。このような辺境の地へようこそお越しくださいました。
そちらのBlogは3E4Dで知って いつも見させてもらっております。
このイベント通知機能はとても便利で 今やあらゆる部分にこれを用いています。汎用関数等にはもってこいのようですね。

投稿者 siratama : 2005年07月31日 17:35

以下コメントを書き込むだけでは、管理人には通知が行われません。通知を行いたい場合、管理人の書き込みに「返信」を押してコメントをしていただくか、あるいは Google+, Twitter へご連絡ください。




[EDIT]