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时,敌人会移动,当计时器结束时,upKey被设置为false,当upKey为false时,有一个if语句会将敌人的速度降为0。
这是我第一次使用计时器,敌人并没有真正停止…它们只是继续移动,直到离开屏幕。我这样做正确吗,还是我的代码中其他地方有问题?另外,有没有更有效的方法来使用计时器?
谢谢,@James。
回答:
从你引用的代码来看,计时器构造函数没有指定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
来操控基于帧的动画。
一种方法是使用计时器来触发游戏模型的状态变化:
/** 计时器 */var timer:Timer;/** 敌人是否在前进 */var advance:Boolean = false;// 以5秒为间隔启动计时器timer = new Timer(5000);timer.addEventListener(TimerEvent.TIMER, timerHandler);timer.start();// 通过Event.ENTER_FRAME控制动画addEventListener(Event.ENTER_FRAME, frameHandler);
在你的计时器处理程序中,你可以根据游戏状态调整计时器延迟。
/** 计时器处理程序 */function timerHandler(event:TimerEvent):void{ // 停止当前计时器 timer.stop(); // 根据当前敌人状态 switch (advance) { // 如果为true,停止前进并等待5秒 case true: trace("停止前进,等待5秒"); timer.delay = 5000; break; // 如果为false,前进2秒 case false: trace("前进2秒"); timer.delay = 2000; break; } // 反转advance状态。 advance = !advance; // 重新启动计时器 timer.start();}
同样,在进入帧时,根据游戏状态控制敌人的动画:
/** 帧处理程序,如果'advance'为true,则前进敌人 */function frameHandler(event:Event):void{ if (advance) { /** 前进敌人 */ }}
这会交替敌人的状态,输出如下:
前进2秒
停止前进,等待5秒
前进2秒
停止前进,等待5秒
前进2秒