• Nov
  • 16
  • 2005

【間に合わせFlash】EventDispacher

便利そうだから間に合わせ的に使っている。本来こういう用法が意図されているかは知らない。
まぁ、便利なんだし、良いんじゃないの?ダメ?
※AS3を視野に入れている人はこんなコトしないで、ちゃんとしたのを勉強してください。

ちゃんとした知識は、

EventDispatcher クラス [ASDoc]

とかで勉強しましょう。

これを使うと、大量のムービークリップとかに同時にイベントを配信できるらしいので、それを使ってみる。
たとえば、attachしたムービークリップを全部同時に動かしたい時。

ふつうだと、forとかで回したりして関数を呼び出す。
でもこれだとなんか便利な感じがする。

1.EventDispatcher.initialize( dispatcher:Object );
2.dispatcher.addEventListener( eventType:String, eventListener );
3.dispatcher.dispatchEvent( eventObj:Object );
(eventObj.type に eventTypeの値)

の3ステップくらいで完成だ。

//ステージ
//importする
import mx.events.EventDispatcher;
//メソッドを受け取るオブジェクト
var dispatcher:Object = new Object();
init();
function init():Void
{
	//オブジェクトにメソッドを追加
	EventDispatcher.initialize( dispatcher );
	attach();
	this.onMouseUp = moveAll;
}
function setEventListener( evtListener:MovieClip ):Void
{
	//イベントを受け取るリスナーを登録
	dispatcher.addEventListener( "moveClip", evtListener );
	//"moveClip"はイベントの種類(ここではattachされたMovieClipの関数名)
	//evtListenerはイベントを受け取るオブジェクト(ここではattachされたMovieClip)
}
//アタッチ
function attach():Void
{
	var mcName:String;
	var mc:MovieClip;
	for( var i:Number = 0; i < 20; i++ )
	{
		mcName = "mc" + i;
		mc = this.attachMovie( "someSym", mcName, this.getNextHighestDepth() );
		mc._x = Math.floor( Math.random() * 500 );
		mc._y = Math.floor( Math.random() * 400 );
	}
}
function moveAll():Void
{
	//登録されたオブジェクトのすべてのリスナーに、指定のイベントオブジェクトをブロードキャスト。
	dispatcher.dispatchEvent( { type:"moveClip" } );
	//引き数はイベントを説明するオブジェクト。type プロパティ(必須)に呼び出すイベントを。
}

attachのタイミングの関係で、addEventListenerは、アタッチされたムービークリップインスタンスから呼ぶことにする。

//リンケージ名「someSym」のシンボル
var tgtX:Number;
var tgtY:Number;
init();
function init():Void
{
	setTarget();
	//リスナーへ登録
	_parent.setEventListener( this );
}
function setTarget():Void
{
	tgtX = Math.floor( Math.random() * 500 );
	tgtY = Math.floor( Math.random() * 400 );
}
function moveClip( evtObj ):Void
{
	//ここでイベントオブジェクトが受け取れる
	trace( [evtObj.type, evtObj.target] );
	this.onEnterFrame = moving;
}
function moving():Void
{
	var dtsX:Number = tgtX - this._x;
	var dtsY:Number = tgtY - this._y;
	this._x += dtsX * 0.5;
	this._y += dtsY * 0.5;
	if( Math.abs( dtsX ) < 1 && Math.abs( dtsY ) < 1 )
	{
		this._x = tgtX;
		this._y = tgtY;
		setTarget();
		delete this.onEnterFrame;
	}
}

moveClipのところで、eventObjectが受け取れるので、引き数が必要な時は、ステージの
dispatcher.dispatchEvent( { type:"moveClip" } );
のところで、typeプロパティの他に何かプロパティを追加してやれば良い。
dispatcher.dispatchEvent( { type:"moveClip", tgtX:100, tgtY:100 } );
とか。

って感じ。

Categories
Tags

TrackBack (0)

TrackBack URL: http://blog.1cco.com/mt/mt-tb.cgi/39
【間に合わせFlash】EventDispacher を参照しているブログ一覧

Post a Comment