这是删除计时器的正确方法吗?

时间:2011-09-20 06:57:39

标签: actionscript-3

我不确定我的方式是否使垃圾收集器移除计时器。这是我的两个功能:

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

由于

3 个答案:

答案 0 :(得分:2)

要删除事件侦听器,您需要使用完全相同的签名将其删除。

如果你这样做:

.addEventListener(TimerEvent.TIMER,waveCall);

然后你需要使用相同的事件类型和函数来删除它:

.removeEventListener(TimerEvent.TIMER,waveCall);

在此处使用TimerEvent.TIMER_COMPLETE将尝试删除不存在的侦听器,该侦听器将被忽略。

在这里使用target是可以的,对于其他侦听器类型,您可能需要使用currentTarget,它始终是侦听器添加到的对象。例如,在鼠标单击事件中,target可能是MovieClip的子项,没有任何侦听器。

答案 1 :(得分:1)

此外,计时器已经能够重复指定的次数,正确的代码将是这样的:

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();
}

答案 2 :(得分:0)

只是改变:

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

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