2012-04-23 2 views
0

У меня есть направление и кнопка спринта. Я хочу, чтобы это произошло: , пока кнопка спринта удерживается, игрок перемещается в два раза быстрее. Затем, когда кнопка спринта отпускается, игрок должен продолжать ходить с обычной скоростью. Однако происходит то, что игрок останавливается, когда кнопка спринта отпускается, хотя кнопка направления все еще удерживается.As3 Touch События, затрагивающие друг друга

public function addControllerListeners(){ 
     controller.leftButton.addEventListener(TouchEvent.TOUCH_ROLL_OVER, moveCharLeft); 
     controller.leftButton.addEventListener(TouchEvent.TOUCH_BEGIN, moveCharLeft); 
     controller.leftButton.addEventListener(TouchEvent.TOUCH_END, playerStop); 
     controller.leftButton.addEventListener(TouchEvent.TOUCH_OUT, playerStop); 
     controller.leftButton.addEventListener(TouchEvent.TOUCH_ROLL_OUT, playerStop); 

     sprintButton.addEventListener(TouchEvent.TOUCH_ROLL_OVER, playerSprint); 
     sprintButton.addEventListener(TouchEvent.TOUCH_BEGIN, playerSprint); 
     sprintButton.addEventListener(TouchEvent.TOUCH_END, playerStopSprint); 
     sprintButton.addEventListener(TouchEvent.TOUCH_OUT, playerStopSprint); 
     sprintButton.addEventListener(TouchEvent.TOUCH_ROLL_OUT, playerStopSprint); 
} 

public function playerSprint(e:Event = null) { 
     playerChar.sprint = true; 
     trace("Player Sprint"); 
} 
public function playerStopSprint(e:Event = null) { 
     playerChar.sprint = false; 
     trace("stopSprinting"); 
} 
public function moveCharLeft(event:TouchEvent):void{ 
     playerChar.setWalk("left"); 
} 
public function playerStop(event:TouchEvent):void { 
     var target:String = event.target.name; 
     if(target == "upButton" || target == "rightButton" || target == "downButton" || target == "leftButton"){ 
      trace("Player Stopped from: " + event.target.name + " - " + event.currentTarget.name); 
      playerChar.direction = "idle"; 
     } 
    } 

Трассировка в функции остановки плеера говорит, что имя цели зависит от того, какая кнопка контроллера удерживается. Несмотря на то, что кнопка отпускания - кнопка спринта.

Если это помогает кнопкам добавить на сцену. Я не думаю, что это должно измениться, но вы никогда не знаете.

+0

Обычно я не добавляю слушателей «вверх», пока не запускается прослушиватель «вниз», а затем я удаляю его в следующем «вверх». –

+0

Спасибо, я прошу попробовать. –

ответ

1

События (касания) не являются постоянными. Когда событие срабатывает, это делается, и вам нужно провести опрос на следующий увольнение. Авто-повтор - это особенность ОС, и это (обычно) прерывается другим аналогичным событием (второе касание остановит первое, я думаю).

Используйте флаг, указывающий, выполнено ли определенное условие. Вам придется вручную и вручную включать и выключать булев, но он сможет отслеживать то, что вам нужно знать. (Аналогичный пример этого можно найти в этом комментарии SO: https://stackoverflow.com/a/7976038/516537. Это случается для событий клавиатуры, которые могут повторяться и сосуществовать с другими событиями клавиатуры, но вы можете видеть использование флага.) Итак, слушайте ваши события, но также:

  1. Флаг при включенном состоянии.
  2. Отключить, когда состояние становится неактивным.
  3. Проверьте, включено ли несколько флагов для активации сложных условий.

Вы получаете постоянство события. Если запускается событие TOUCH_BEGIN (или другое стартовое), но не выполняется событие TOUCH_END (или другое завершение), флаг будет вашим способом узнать, что событие касания все еще существует.

Предостережение ко всему этому заключается в том, что вам придется опросить события несколько иначе. Вам нужно будет добавить прослушиватель событий Event.ENTER_FRAME, чтобы продолжать проверять, какие события все еще активны.

HTH.

+0

Спасибо, если бы я мог проголосовать за вас, я бы (пока не могу). –

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