- 2008年6月16日 14:13
- ActionScript 3.0
AS3の肝ともいえる、イベント処理 addEventListener は
になっとりますが
ここに無名関数をセットすると removeEventListener するために
無名関数への参照を持っとくとかしないといけないなー・・・って思ってたんですが
よく考えたら arguments.callee があるじゃないかというメモ。
addEventListener( イベントタイプ, イベントハンドラ );
になっとりますが
ここに無名関数をセットすると removeEventListener するために
無名関数への参照を持っとくとかしないといけないなー・・・って思ってたんですが
よく考えたら arguments.callee があるじゃないかというメモ。
いままで、例えばDisplayObjectを横方向に100pixアニメーションさせる時は
var someMovieClip :MovieClip;
var targetX:Number;
startAnimation( someMovieClip );
/**
* 指定したMovieClipをアニメーションさせる.
* @param target アニメーションさせたいMovieClip
*/
function startAnimation( target:MovieClip ){
targetX = target.x + 100;
target.addEventListener( Event.ENTER_FRAME, onEnterFrame );
}
/**
* アニメーション処理.
*/
function onEnterFrame( event:Event ){
event.target.x += 10;
if( targetX <= event.target.x ) { // 100以上移動したらやめる
event.target.x = targetX;
removeEventListener( Event.ENTER_FRAME, onEnterFrame );
}
}
とかやってて、毎回毎回関数定義せにゃいかんし、クロージャ使えんし
なにより、移動後の座標をわざわざメンバにもたにゃいかんしなんか無駄に思えちゃう。
でも、removeEventListenerやるときに関数の参照ちゃんとしないと消えてくれないし
とか悶々としてたわけですが、よく考えたら
var someMovieClip :MovieClip;
startAnimation( someMovieClip );
/**
* 指定したMovieClipをアニメーションさせる.
* @param target アニメーションさせたいMovieClip
*/
function startAnimation( target:MovieClip ){
var targetX:Number = target.x + 100;
target.addEventListener( Event.ENTER_FRAME, function( event:Event ){
event.target.x += 10;
if( targetX <= event.target.x ) { // 100以上移動したらやめる
event.target.x = targetX;
removeEventListener( event.type, arguments.callee );
}
}
}
でもできるのか。
無名関数とか使ってて、大規模開発では煙たがられそうだけど
そこまでヤバイことしてないから大丈夫じゃないかなと思ってみたり。
なによりソースコードがかなり短くて巨大なクラスになりにくい。
『でも外部からremoveEventListener出来ねーじゃん。』
とか言われそうですが。まあその辺のことはゴフッゲフッ・・・
うーん・・・
やっぱ関数定義してそれ使うのが無難なのかなあ
- Newer: 今更ながらの宣伝:本書きました
- Older: AS3.0 イベントの制御 MouseEvent.CLICK編