2014-12-08 6 views
2

Я делаю шутер с сценария действий 3. У меня есть герой, который движется, когда любой из клавиши со стрелкой нажата мой код выглядит следующим образомОдновременное нажатие вызывающее нежелательное поведение

//some class level variables 
private var vx :int = 0; 
private var vy :int = 0; 

//in the Main constructor 
stage.addEventListener(KeyboardEvent.KEY_DOWN , moveHero); 
stage.addEventListener(KeyboardEvent.KEY_UP , stopHero); 
stage.addEventListener(Event.ENTER_FRAME , onEnter); 

//and all the handlers 
function moveHero(e:KeyboardEvent) 
{ 
    if (e.keyCode == 37) 
    { 
     vx = -5; 
    } 
    else if (e.keyCode == 38) 
    { 
     vy = -10; 
    } 
    else if (e.keyCode == 39) 
    { 
     vx = 5; 
    } 
    else if (e.keyCode == 40) 
    { 
     vy = 10; 
    } 
} 
function stopHero(e:KeyboardEvent) 
{ 
    //when key is up stop miving the hero 
    vx = 0; 
    vy = 0; 
} 
function onEnter(e:Event):void 
{ 
    //updtae hero position 
    hero.x += vx; 
    hero.y += vy; 
} 

Теперь моя проблема когда пользователь имеет и клавиши вверх и вниз или влево и вправо под его пальцами и вдруг прижать их попеременно то герой показывает заметное отставание в создании реакции на нажатие клавиш

+1

Ключевым прессам следует установить булевы, а в вашем прослушивающем устройстве enterframe вы должны перемещать символ в соответствии с этими булевыми. Само действие не должно происходить в обработчике нажатия клавиш. – BotMaster

+0

@BotMaster Почему OP нуждается в прослушивателе enterframe? – akmozo

ответ

1

Вы должны будете сделать так же, как Botmaster сказал в комментариях, и вот как это выглядит в Код AS3:

var keys:Array = new Array(255); 

stage.addEventListener(KeyboardEvent.KEY_DOWN , keyDown); 
stage.addEventListener(KeyboardEvent.KEY_UP , keyUp); 
stage.addEventListener(Event.ENTER_FRAME , loop); 

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

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

function loop(e:Event):void { 
    if(keys[Keyboard.LEFT]) { 
     trace("Moving left..."); 
    } else if(keys[Keyboard.RIGHT]) { 
     trace("Moving right..."); 
    } 
} 
+0

Почему нам нужны 'KeyboardEvent.KEY_UP' и' Event.ENTER_FRAME'? – akmozo

+0

@akmozo 'KEY_DOWN' и' KEY_UP' устанавливают состояния в нашем массиве 'keys', который мы позже запрашиваем в нашем основном цикле о том, включен ли ключ или нет. – Iggy

+0

Я понимаю, что вы делаете, но зачем нам нужен цикл с использованием Event.ENTER_FRAME, когда только KeyboardEvent.KEY_DOWN может выполнить эту работу? – akmozo

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