2

此代码会延迟每次触发循环之间的时间吗?

  while (coin.x > objYEnemy.x) {

    var delay:Timer = new Timer(100, 1);
    delay.addEventListener(TimerEvent.TIMER, runOnce);
    delay.start();
    function runOnce(event:TimerEvent):void {
            coin.x -= 1;
    delay.stop();
    }
}
4

2 回答 2

4

并不真地。您的循环将不断运行(至少 100 毫秒,而您的计时器等待触发),每次创建一个新计时器并创建内存泄漏,因为您的计时器将永远不会因为它们的事件侦听器而被丢弃。由于您的 runOnce 是一个匿名函数,因此对于每个创建的计时器,它也会运行很多次。

在不确切知道您要完成的工作的情况下,您似乎想要做的是让计时器滴答处理程序成为循环函数。

var checkTimer:Timer = new Timer(100);
checkTimer.addEventListener(TimerEvent.TIMER, doCheck);
checkTimer.start();

function doCheck(e:Event):void {
    if(coin.x > objYEnemy.x){
        coin.x -= 1;
        //If you want this to only happen once, then add the following line:
        checkTimer.stop();       
    }
}
于 2012-09-07T16:21:06.930 回答
0

不。第一个问题是,runOnce第一次运行循环时未定义,所以它甚至不会运行一次。第二个问题是这段代码的执行顺序:循环将启动大量计时器,直到满足中断条件,一旦某些计时器触发了runOnce. 使用 LondonDrugs_MediaServ 的代码,并在您不再需要计时器后取消注册事件侦听器,以便它可以收集垃圾。

于 2012-09-07T16:26:16.087 回答