从您引用的代码中,计时器构造函数未指定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 秒