2016-01-03 1 views
1

У меня есть проблемы с ходьбой моего персонажа. Это немного замедляет движение, прежде чем он начнет двигаться. И затем порой он полностью игнорирует команду, чтобы остановить ходьбу, когда я выпустил ключ.Какая ошибка заставляет мой персонаж откладывать ответ при нажатии клавиши?

Код:

import flash.events.KeyboardEvent; 
import flash.ui.Keyboard; 
import flash.display.MovieClip; 
import flash.events.Event; 
import flash.display.Stage; 

hero.gotoAndStop(1); 

var rightPressed: Boolean = new Boolean(false); 
var leftPressed: Boolean = new Boolean(false); 
var upPressed: Boolean = new Boolean(false); 
var downPressed: Boolean = new Boolean(false) 
var heroSpeed: Number = 10; 
var keys: Array = []; 

stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler); 
stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler); 
stage.addEventListener(Event.ENTER_FRAME, gameLoop); 
stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown); 
stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp); 

function keyDownHandler(KeyEvent: KeyboardEvent): void { 
    if (keys[Keyboard.RIGHT]) { 
     rightPressed = true; 
    } else if (keys[Keyboard.LEFT]) { 
     leftPressed = true; 
    } else if (keys[Keyboard.DOWN]) { 
     downPressed = true; 
    } else if (keys[Keyboard.UP]) { 
     upPressed = true; 
    } 
} 

function keyUpHandler(KeyEvent: KeyboardEvent): void { 
    if (keys[Keyboard.RIGHT]) { 
     rightPressed = false; 
     hero.gotoAndStop(4) 
    } else if (keys[Keyboard.LEFT]) { 
     leftPressed = false; 
     hero.gotoAndStop(2) 
    } else if (keys[Keyboard.DOWN]) { 
     downPressed = false; 
     hero.gotoAndStop(1); 
    } else if (keys[Keyboard.UP]) { 
     upPressed = false; 
     hero.gotoAndStop(3); 
    } 
} 

function gameLoop(loopEvent: Event): void { 
    if (rightPressed) { 
     hero.x += heroSpeed; 
     hero.gotoAndStop(8) 
    } 
    if (leftPressed) { 
     hero.x -= heroSpeed; 
     hero.gotoAndStop(6) 
    } 
    if (downPressed) { 
     hero.y += heroSpeed; 
     hero.gotoAndStop(5); 
    } 
    if (upPressed) { 
     hero.y -= heroSpeed; 
     hero.gotoAndStop(7); 
    } 
} 
function onKeyDown(e: KeyboardEvent): void { 
    keys[e.keyCode] = true; 
} 

function onKeyUp(e: KeyboardEvent): void { 
    keys[e.keyCode] = false; 
} 

Предупреждения:

Scene 1, Layer 'Actions', Frame 1, Line 68, Column 10 Warning: 1090: Migration issue: The onKeyDown event handler is not triggered automatically by Flash Player at run time in ActionScript 3.0. You must first register this handler for the event using addEventListener ('keyDown', callback_handler). 

Scene 1, Layer 'Actions', Frame 1, Line 72, Column 10 Warning: 1090: Migration issue: The onKeyUp event handler is not triggered automatically by Flash Player at run time in ActionScript 3.0. You must first register this handler for the event using addEventListener ('keyUp', callback_handler). 

ответ

0

Вы должны избавиться от двух дополнительных KeyboardEvent обработчиков (onKeyUp и onKeyDown), и переместить код, который вы имеете там в keyUpHandler и keyDownHandler. Это решит эти предупреждения о миграции (поскольку onKeyUp и onKeyDown были специальными методами в AS2), и это может быть решением вашей другой проблемы: я думаю, иногда обработчик onKeyDown запускается после keyDownHandler, что означает, что логические значения в вашем массиве не являются еще не установлен, и движение не начнется.

Еще лучше: и избавиться от массива с булевы (и ключи вы злоупотребляя массив для использования словарей!) И сделать это следующим образом:

function keyDownHandler(KeyEvent: KeyboardEvent): void { 
    if (event.keyCode==Keyboard.RIGHT]) { 
     rightPressed = true; 
    } 
    //etc  
} 
+0

Можете ли вы вдаваться в подробности о том, что я должен делать? Вы сказали, что переместите код, который у меня есть, в «keyUpHandler» и «keyDownHandler», однако какой код вы предпочитаете вводить в «keyUpHandler» и «keyDownHandler»? –

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

  • Нет связанных вопросов^_^