Как обнаружить удерживаемый ключ во флеш игре? - PullRequest
1 голос
/ 12 сентября 2010

Как правильно определять удерживаемые клавиши во флэш-игре?Например, я хочу знать, что стрелка вправо удерживается для перемещения игрока.

Наивный код:

function handleKeyDown(event:KeyboardEvent) {
    held[event.keyCode] = true;
}

function handleKeyUp(event:KeyboardEvent) {
    held[event.keyCode] = false;
}

stage.addEventListener(KeyboardEvent.KEY_DOWN, handleKeyDown);
stage.addEventListener(KeyboardEvent.KEY_UP, handleKeyUp);

Наивный код имеет проблемы на некоторых компьютерах.Событие KEY_DOWN многократно чередуется с KEY_UP для удерживаемого ключа.Это делает ключ, кажется, выпущенным в некоторых кадрах.

Пример видимых событий:

[Just holding a single key.]
KEY_DOWN,KEY_UP,KEY_DOWN,KEY_UP,KEY_DOWN,KEY_UP,...

Ответы [ 2 ]

0 голосов
/ 13 сентября 2010

Мой обходной путь - вспомнить ключи, которые были видел хотя бы один раз в этом кадре.

function handleKeyDown(event:KeyboardEvent) {
    held[event.keyCode] = true;
    justPressed[event.keyCode] = true;
}

function handleKeyUp(event:KeyboardEvent) {
    held[event.keyCode] = false;
}

// You should clear the array of just pressed keys at the end
// of your ENTER_FRAME listener.
function clearJustPressed() {
    justPressed.length = 0;
}

И я использую функцию, чтобы проверить, не нажата ли клавиша в этом кадре:

function pressed(keyCode:int) {
    return held[keyCode] || justPressed[keyCode];
}
0 голосов
/ 12 сентября 2010

вот быстрое решение, с ограничением, что он может работать только по одной клавише за раз

var currentKey:uint;

function handleKeyDown(event:KeyboardEvent) {
    held[event.keyCode] = true;

    //make sure the currentKey value only changes when the current key 
    //has been released. The value is set to 0 , 
    //but it should be any value outside the keyboard range
    if( currentKey == 0 )
    {
        currentKey = event.keyCode;

       //limitation: this can only work for one key at a time
       addEventListener(Event.ENTER_FRAME , action );
    }
}

function handleKeyUp(event:KeyboardEvent) {
    held[event.keyCode] = false;

    if( currentKey != 0 )
    {
        //reset
        removeEventListener(Event.ENTER_FRAME , action );
        currentKey = 0;
    }
}

function action(event:Event):void
{
   //your code here
}

stage.addEventListener(KeyboardEvent.KEY_DOWN, handleKeyDown);
stage.addEventListener(KeyboardEvent.KEY_UP, handleKeyUp);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...