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

嘿伙计们,这是我的代码。我的游戏中有一些非常简单的 AI,我正在尝试使用计时器让敌人向前移动大约 2-3 秒然后停止。为此,我使用变量 upKey 作为设置为 true 的布尔值,但是当计时器完成时,它被设置为 false,并且在设置为 false 时,有一个 if 语句会将敌人的速度降低到 0 .

这是我第一次使用计时器,敌人并没有真正停止……他们只是继续前进,直到他们离开屏幕。我这样做是正确的还是我的代码中的其他地方有问题?另外,有没有更好更有效的方式来使用计时器?

谢谢,詹姆斯。

4

1 回答 1

1

从您引用的代码中,计时器构造函数未指定repeatCount指示它应该无限期地重复。对于timerDone()要调用的处理程序,您必须指定重复计数。

另外,请注意,不推荐低于 20 毫秒的延迟。

定时器构造函数参数:Timer(delay:Number, repeatCount:int = 0)

delay:Number— 定时器事件之间的延迟,以毫秒为单位。不推荐低于 20 毫秒的延迟。定时器频率限制为每秒 60 帧,这意味着低于 16.6 毫秒的延迟会导致运行时问题。

repeatCount:int(默认 = 0)— 指定重复次数。如果为零,则计时器无限期重复,最长可达 24.86 天 ( int.MAX_VALUE + 1)。如果非零,则计时器运行指定的次数然后停止。

不建议将计时器用于动画内容。相反,用于Event.ENTER_FRAME操作基于帧的动画。

一种方法是使用计时器来触发游戏模型的状态更改:

/** 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 回答