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
这是我第一次使用计时器而敌人并没有真正停止......他们只是继续前行直到他们离开屏幕。我这样做是正确的还是我的代码中的其他问题?另外,使用计时器有更好的方法吗?
谢谢,詹姆斯。
答案 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秒