定时器AI不工作

时间:2013-05-17 02:33:17

标签: actionscript-3 timer artificial-intelligence

        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

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

谢谢,詹姆斯。

1 个答案:

答案 0 :(得分: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秒