2013-05-17 2 views
2
 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 как boolean, для которой установлено значение true, но когда таймер заканчивается, он получает значение false, а при установке false, есть оператор if, который уменьшает скорость противника до 0 .Таймер AI не работает

Это мой первый таймер, и враги не останавливаются ... они вроде как продолжат идти, пока они не уйдут с экрана. Я делаю это правильно или это проблема в другом месте моего кода? Кроме того, есть ли более эффективный способ использования таймера?

Спасибо, Джеймс.

ответ

1

Из кода, который вы цитируете, конструктор таймера не указывает 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 секунды

+0

Эй, человек, спасибо.То, что я пытаюсь сделать сейчас, это запустить его так, чтобы они продвигались в течение нескольких секунд, а затем останавливались при этом .rotation + = 5, пока он не будет равен правильному углу (лицом к игроку). Я думаю, что мой код, чтобы изменить направление к игроку в порядке, но враги даже не вращаются, и я думаю, что это потому, что я все еще плохой в таймерах или что-то в этом роде. –

+0

Я действительно ценю вашу помощь. –

+0

это мой текущий код проблемы: \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} –

Смежные вопросы