Из кода, который вы цитируете, конструктор таймера не указывает repeatCount
, указывающий, что он должен повторяться неопределенно долго. Для обработчика timerDone()
вы должны указать количество повторов.
Также обратите внимание, что задержка менее 20 миллисекунд не рекомендуется.
параметры таймера конструктора: Timer(delay:Number, repeatCount:int = 0)
delay:Number
- Задержка между событиями таймера в миллисекундах. A Задержка менее 20 миллисекунд не рекомендуется. Частота таймера ограничена 60 кадрами в секунду, что означает задержку ниже 16,6 миллисекунд, что приводит к проблемам времени выполнения.
repeatCount:int
(default = 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 */ }
}
Это чередуется состояние ваших врагов, выводя:
Advance для следующих 2-х секунд
Остановить движение, подождать 5 секунд
Прогресс на следующие 2 секунды
Остановить движение, подождать 5 секунд
Прогресс на следующие 2 секунды
Эй, человек, спасибо.То, что я пытаюсь сделать сейчас, это запустить его так, чтобы они продвигались в течение нескольких секунд, а затем останавливались при этом .rotation + = 5, пока он не будет равен правильному углу (лицом к игроку). Я думаю, что мой код, чтобы изменить направление к игроку в порядке, но враги даже не вращаются, и я думаю, что это потому, что я все еще плохой в таймерах или что-то в этом роде. –
Я действительно ценю вашу помощь. –
это мой текущий код проблемы: \t \t \t функция redirectPlayer(): пустота \t \t \t { \t \t \t \t вар enGlobalPos: Точка = localToGlobal (новая точка (this.x, this.y)) \t \t \t \t var dX: Number = enGlobalPos.x - playerLoc.x; \t \t \t \t var dY: Number = enGlobalPos.y - playerLoc.y; \t \t \t \t // Получить вращение противника \t \t \t \t вар radRotation: Number = Math.atan2 (Dy, Dx); \t \t \t \t degRotation = radRotation * (180/Math.PI); \t \t \t \t // Установить вращение проигрывателя \t \t \t \t this.rotation + = enTurnSpeed; \t \t \t \t, если (this.rotation == degRotation) \t \t \t \t { \t \t \t \t \t this.rotation = 0; \t \t \t \t \t upKey = true; \t \t \t \t \t moveTimer.start(); \t \t \t \t} \t \t \t} –