首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >计时器AI不工作

计时器AI不工作
EN

Stack Overflow用户
提问于 2013-05-17 10:33:17
回答 1查看 660关注 0票数 2
代码语言:javascript
运行
复制
        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;
        }

嘿,伙计们,这是我的代码。我的游戏中有一些非常简单的人工智能,我试图利用一个计时器来让敌人向前移动大约2-3秒,然后停下来。为了做到这一点,我使用变量upKey作为布尔值,它被设置为真,但是当计时器结束时,它被设置为假,当它被设置为假时,有一个if语句将敌人的速度降低到0。

这是我第一次使用计时器,敌人并没有真正停止…他们就这样一直往前走,直到消失在屏幕上。我这样做是正确的,还是我的代码中的其他地方有问题?还有,有没有更好更有效的方法来使用计时器?

谢谢,詹姆斯。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-17 10:51:16

从您引用的代码中可以看出,timer构造函数没有指定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来操作基于帧的动画。

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

代码语言:javascript
运行
复制
/** 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);

在计时器处理程序中,您可以根据游戏状态调整计时器延迟。

代码语言:javascript
运行
复制
/** 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();
}

同样,在enter帧中,根据游戏状态控制敌人的动画:

代码语言:javascript
运行
复制
/** frame handler, advancing enemy if 'advance' is true */
function frameHandler(event:Event):void
{
    if (advance) { /** move enemy forward */ }
}

这会交替你的敌人的状态,输出:

在接下来的2秒内推进

停止前进,等待5秒

前进到下一个2秒

停止前进,等待5秒

为接下来的2秒提供支持

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16600536

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档