- Nov
- 16
- 2005
【間に合わせFlash】EventDispacher
便利そうだから間に合わせ的に使っている。本来こういう用法が意図されているかは知らない。
まぁ、便利なんだし、良いんじゃないの?ダメ?
※AS3を視野に入れている人はこんなコトしないで、ちゃんとしたのを勉強してください。
ちゃんとした知識は、
とかで勉強しましょう。
これを使うと、大量のムービークリップとかに同時にイベントを配信できるらしいので、それを使ってみる。
たとえば、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 } );
とか。
って感じ。
- Posted
- 22:16
- Auther
- ken
- Comments (0)
- TrackBacks (0)
- Permalink
- Retweet
TrackBack (0)
TrackBack URL: http://blog.1cco.com/mt/mt-tb.cgi/39
【間に合わせFlash】EventDispacher を参照しているブログ一覧


Post a Comment