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ループを初めて実行するときにが未定義であるため、一度も実行されないことです。2番目の問題は、このコードが実行されるシーケンスです。ループは、ブレーク条件が満たされるまで、大量のタイマーを開始します。これは、一部のタイマーがの実行をトリガーするとすぐに発生しますrunOnce。LondonDrugs_MediaServのコードを使用し、タイマーが不要になったらイベントリスナーの登録を解除して、ガベージコレクションを実行できるようにします。

于 2012-09-07T16:26:16.087 に答える