Отображение кода клавиатуры в Adobe Flash / Flex для браузера - PullRequest
2 голосов
/ 18 июня 2009

N.B. Имейте в виду разницу между ключом кодом и символом кодом. Например, номер 1 (один) и персонаж! (Взрыв) оба имеют одинаковый код ключ , но разные коды символ . Аналогично, число 7 в ряду чисел и число 7 в цифровой клавиатуре имеют разные коды key , но одинаковые символ коды.

Я программирую музыкальную ритмическую игру в Adobe Flex и хотел бы связать клавиши клавиатуры. Это не проблема, но у меня наверняка возникнет проблема, скажем, при установке ключей по умолчанию A, S, D и F и сообщении пользователю, что это так.

Если вы посмотрите документацию для flash.ui.Keyboard , вы увидите, что есть константы для клавиш клавиатуры и кодов клавиш. Однако они доступны только в Adobe AIR, а не в браузере. Это имеет смысл, поскольку не все операционные системы и клавиатуры одинаковы (или присутствуют!), Поэтому коды клавиш могут различаться.

Итак, как я могу назначить ключи по умолчанию, которые имеют значение, вместо того, чтобы выбирать коды клавиш и молиться?

Моя единственная вменяемая мысль - сохранить коды символов для привязок клавиш, а затем предоставить код символа для сопоставления строк, чтобы я мог сказать пользователю, что нажимать. Однако, моя интуиция говорит мне, что это сломается тонкими или не очень тонкими способами. Как CAPSLOCK.

Спасибо.

Обновление: В настоящее время я использую ответ radekg , но я все еще думаю, что это легко сломается. Я бы чувствовал себя более комфортно с некоторым убеждением, что это правильно.

Ответы [ 2 ]

4 голосов
/ 19 июня 2009

в соответствии с документацией по Flash 8 вы можете просто положиться на коды ASCII. Взгляните на эти темы документации по Flash 8:

Насколько мне известно, все современные операционные системы используют стандарт ASCII. Эти коды не изменились со времен Flash 5. Для сравнения букв, если вы не хотите полагаться на коды ASCII:

private function compareChar(code:Number):void {
    if ( "a" == String.fromCharCode( code ).toLowerCase() ) {
        trace("A pressed");
    } else {
        trace("You pressed " + String.fromCharCode(code));
    }
}
...
compareChar(65); // 65 is A
compareChar(96); // 96 is numpad 0

Однако я думаю, что вы можете положиться на коды ASCII. Надеюсь, это поможет.

2 голосов
/ 24 июня 2009

Радек в основном правильный.

Flash имеет встроенный класс flash.ui.KeyLocation с четырьмя статическими свойствами: LEFT, RIGHT, NUM_PAD, STANDARD. Это означает, что вы можете иметь четкое представление о том, какая клавиша была нажата, даже если клавиатура была переназначена. Если вы сделаете это в сочетании с String.fromCharCode, вы сможете довольно аккуратно решить эту проблему.

Ваш окончательный код может выглядеть следующим образом:

import flash.ui.KeyLocation;
import flash.events.KeyboardEvent;

function handleKeyboardEvent( event:KeyboardEvent )
{
    // This will work for a majority of the keys.
    var key:String = String.fromCharCode( event.charCode ).toLowerCase();

    // Use strict comparison
    if( event.keyLocation !== KeyLocation.STANDARD )
    {
        // The key is a number, then it needs to be re-identified.
        if( event.keyLocation == KeyLocation.RIGHT  )    key = "r" + key;
        if( event.keyLocation == KeyLocation.LEFT   )      key = "l" + key;
        if( event.keyLocation == KeyLocation.NUM_PAD)   key = "n" + key;
    }

    switch( key )
    {
        case "r1":
            // Do something with the one which is not on the keypad.
            break;
        case "n.":
            // Do something with the number pad's period.
            break;
        case "n":
            // Do something with the letter N.
            break;
    }
}

Я признаю, я не уверен, что произойдет с String.fromCharCode и управляющими клавишами (F1, Alt, Ctrl и т. Д.), Но KeyboardEvent поддерживает event.shiftKey, event.ctrlKey, event.altKey

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...