开发者

Is this the correct way to remove a timer?

开发者 https://www.devze.com 2023-04-06 14:51 出处:网络
I\'m not sure if the way I did makes the garbage collector remove the timer. Here are my two functions:

I'm not sure if the way I did makes the garbage collector remove the timer. Here are my two functions:

public function newWave() {
    var callTimer:Timer = new Timer(800);
    callTimer.start();
    leftToSpawn = 4;
    callTimer.addEventListener开发者_C百科(TimerEvent.TIMER,waveCall);
}
public function waveCall(e:TimerEvent) {
    leftToSpawn--;
    if(leftToSpawn <= 0){
        e.target.stop();
        e.target.removeEventListener(TimerEvent.TIMER_COMPLETE,waveCall);
    }
    spawnEnemy();
}

Thanks


To remove an event listener you need to remove it with the exact same signature.

If you do:

.addEventListener(TimerEvent.TIMER,waveCall);

Then you need to use the same event type and function to remove it:

.removeEventListener(TimerEvent.TIMER,waveCall);

Using TimerEvent.TIMER_COMPLETE here will try to remove a listener that doesn't exist, which is silently ignored.

Using target here is ok, for other listener types you may need to use currentTarget, which is always the object the listener got added to. For example in a mouse click event, target could be a child of a MovieClip and without any listeners.


Moreover, timer already has ability to repeat specified number of times and the correct code will be like this:

public function newWave() {
var callTimer:Timer = new Timer(800, 4); //repeat 4 times
callTimer.start();
callTimer.addEventListener(TimerEvent.TIMER,waveCall);
}

public function waveCall(e:TimerEvent) {
spawnEnemy();
}


just change:

e.target.removeEventListener(TimerEvent.TIMER_COMPLETE,waveCall);

to

e.target.removeEventListener(TimerEvent.TIMER,waveCall);
0

精彩评论

暂无评论...
验证码 换一张
取 消