Что я делаю для управления движением, так это наличие двухступенчатых слушателей KeyboardEvent (KEY_DOWN и KEY_UP) и таймера, который запускает каждый кадр. События клавиатуры не обрабатывают управление, они только обрабатывают изменяющиеся значения stati c, такие как keyLeftIsDown
и keyRightIsDown
(в вашем случае вы также можете обрабатывать, когда нажимается пробел), а прослушиватель Timer - это то, что обрабатывает управление , Вот как это может выглядеть:
private var keyLeftIsDown:Boolean;
private var keyRightIsDown:Boolean;
//The '60' in '1000 / 60' is the frames per second the program runs in. Change it as needed
private var movementTimer:Timer = new Timer(1000 / 60);
private function initialize():void {
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDown);
stage.addEventListener(KeyboardEvent.KEY_UP, keyUp);
timer.addEventListener(TimerEvent.TIMER, movementUpdate);
timer.start();
}
private function keyDown(e:KeyboardEvent):void {
if (e.keyCode == Keyboard.LEFT) {
keyLeftIsDown = true;
}
else if (e.keyCode == Keyboard.RIGHT) {
keyRightIsDown = true;
}
else if (e.keyCode == Keyboard.SPACE) {
//jump code goes here
}
}
private function keyUp(e:KeyboardEvent):void {
if (e.keyCode == Keyboard.LEFT) {
keyLeftIsDown = false;
}
else if (e.keyCode == Keyboard.RIGHT) {
keyRightIsDown = false;
}
}
private function movementUpdate(e:TimerEvent):void {
if (keyLeftIsDown && !keyRightIsDown) {
char.x -= char.speed;
}
else if (keyRightIsDown && !keyLeftIsDown) {
char.x += char.speed;
}
}
Таким образом, символ перемещается в направлении x, даже если код обрабатывает скачки!