2
        var moveTimer:Timer = new Timer(1);
        moveTimer.addEventListener(TimerEvent.TIMER, timerListener);
        function timerListener (e:TimerEvent):void
        {
            //code
        }
        moveTimer.start();
        moveTimer.addEventListener(TimerEvent.TIMER_COMPLETE, timerDone)
        function timerDone(e:TimerEvent):void 
        {
            upKey = false;
        }

Hey Guys、これが私のコードです。私のゲームには非常に単純化された AI がいくつかあり、敵が約 2 ~ 3 秒間前進してから停止するようにタイマーを利用しようとしています。これを行うには、true に設定されたブール値として変数 upKey を使用していますが、タイマーが終了すると false に設定され、false に設定されると、敵の速度を 0 に下げる if ステートメントがあります。 .

タイマーを使うのはこれが初めてで、敵は本当に止まりません...画面から消えるまで動き続けます。これを正しく行っていますか、それともコードの他の場所に問題がありますか? また、タイマーを使用するより効率的な方法はありますか?

ありがとう、ジェームズ。

4

1 に答える 1

1

あなたが引用したコードから、タイマーコンストラクターは、repeatCountそれが無期限に繰り返されることを示すことを指定していません。ハンドラーを呼び出すにはtimerDone()、繰り返し回数を指定する必要があります。

また、20 ミリ秒未満の遅延は推奨されないことに注意してください。

タイマー コンストラクターのパラメーター:Timer(delay:Number, repeatCount:int = 0)

delay:Number— ミリ秒単位のタイマー イベント間の遅延。20 ミリ秒未満の遅延は推奨されません。タイマーの頻度は 1 秒あたり 60 フレームに制限されています。つまり、遅延が 16.6 ミリ秒未満であると、実行時に問題が発生します。

repeatCount:int(デフォルト = 0) — 繰り返し回数を指定します。ゼロの場合、タイマーは最大 24.86 日 ( int.MAX_VALUE + 1) まで無期限に繰り返されます。ゼロ以外の場合、タイマーは指定された回数実行されてから停止します。

アニメーション コンテンツにはタイマーを使用しないことをお勧めします。代わりに、Event.ENTER_FRAMEフレームベースのアニメーションを操作するために使用してください。

1 つのアプローチは、タイマーを使用してゲーム モデルの状態変更をトリガーすることです。

/** timer */
var timer:Timer;

/** whether enemies are advancing */
var advance:Boolean = false;

// start timer at 5-seconds intervals
timer = new Timer(5000);
timer.addEventListener(TimerEvent.TIMER, timerHandler);
timer.start();

// animation controlled by Event.ENTER_FRAME
addEventListener(Event.ENTER_FRAME, frameHandler);

タイマー ハンドラーでは、ゲームの状態に応じてタイマーの遅延を調整できます。

/** timer handler */
function timerHandler(event:TimerEvent):void
{
    // stop the current timer
    timer.stop();

    // depending on the current enemy state
    switch (advance)
    {
        // if true, stop advancing and wait 5-seconds
        case true:
            trace("Stop advancing, wait 5-seconds");
            timer.delay = 5000;
            break;
        // if false, advance for 2-seconds
        case false:
            trace("Advance for next 2-seconds");
            timer.delay = 2000;
            break;
    }

    // invert advance state.
    advance = !advance;

    // restart timer
    timer.start();
}

同様に、エンター フレームで、ゲームの状態に基づいて敵のアニメーションを制御します。

/** frame handler, advancing enemy if 'advance' is true */
function frameHandler(event:Event):void
{
    if (advance) { /** move enemy forward */ }
}

これにより、敵の状態が交互になり、次のように出力されます。

次の 2 秒間
前進する 前進を停止し、5 秒待つ
次の 2 秒間前進する
前進を停止し、5 秒待つ
次の 2 秒間前進する

于 2013-05-17T02:51:15.977 に答える