Как получить все ключевые состояния при использовании asm.js/emscripten/SDL?

При использовании SDL для ввода с клавиатуры работают только определенные клавиши (стрелки, pageup\pagedown).

Это код, который я использую:

const auto sdlScanCodes = {...SDL_SCANCODE_A, SDL_SCANCODE_F1, SDL_SCANCODE_SPACE, SDL_SCANCODE_LSHIFT ...etc}

SDL_PumpEvents();
const auto sdlKeyStatesPtr = SDL_GetKeyboardState(nullptr);
for(auto sdlScanCode: sdlScanCodes) {
    const auto sdlKeyCode = SDL_SCANCODE_TO_KEYCODE(sdlScanCode);
    const bool downKeyCode = sdlKeyStatesPtr[sdlKeyCode];
    const bool downScanCode = sdlKeyStatesPtr[sdlScanCode];
}

Обновление: обратите внимание, что downScanCode никогда не работает, и, как было сказано, downKeyCode работает для некоторых клавиш.


person Viktor Sehr    schedule 17.12.2014    source источник
comment
Можете ли вы показать свой цикл событий, а не только этот фрагмент? Контекст недостаточно ясен, чтобы увидеть, как вы ожидаете увидеть изменения ключевых состояний.   -  person Jonny D    schedule 18.12.2014
comment
@Jonny D: Обновил ответ, в любом случае спасибо за ваше время.   -  person Viktor Sehr    schedule 19.12.2014


Ответы (2)


Массив, возвращаемый SDL_GetKeyboardState, должен быть проиндексирован скан-кодами в SDL 2.0, а не кодами клавиш, как в SDL 1.2. Попробуйте сделать это без преобразования SDL_SCANCODE_TO_KEYCODE.

Для справки: https://wiki.libsdl.org/SDL_GetKeyboardState

Кроме того, я должен указать, что SDL_SCANCODE_TO_KEYCODE не является макросом преобразования общего назначения. Он просто устанавливает старший бит, чтобы определенные скан-коды могли быть уникальными. Используйте SDL_GetKeyFromScancode и SDL_GetScancodeFromKey.

person Jonny D    schedule 18.12.2014

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

const auto sdlKeyCodes = {...SDLK_a, SDLK_F1, SDLK_SPACE, SDLK_LSHIFT ...etc}

SDL_PumpEvents();
const auto sdlKeyStatesPtr = SDL_GetKeyboardState(nullptr);
for(auto sdlKeyCode: sdlKeyCodes ) {
    const bool downKeyCode = sdlKeyStatesPtr[sdlKeyCode];
}
person Viktor Sehr    schedule 19.12.2014
comment
Как указано в связанной документации, вы должны использовать скан-коды. Только некоторые значения кодов клавиш совпадают со сканкодами. Если все равно не работает, то дело в другом. Я знаю, что emscripten работает с SDL 1.2, но я не уверен в статусе с SDL 2. Удачи! - person Jonny D; 19.12.2014
comment
Как продолжение этого, порт исходного кода C с emscripten и SDL 2.0 был анонсирован только сегодня (24.12.14). Теперь он находится в официальном репозитории SDL hg. - person Jonny D; 24.12.2014