使用asm.js / emscripten / SDL时如何获取所有关键状态?

时间:2014-12-17 10:46:56

标签: javascript c++ sdl emscripten asm.js

当使用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 适用于某些键。

2 个答案:

答案 0 :(得分:1)

SDL_GetKeyboardState返回的数组应该由SDL 2.0中的扫描码索引,而不是SDL 1.2中的密钥码。尝试在没有SDL_SCANCODE_TO_KEYCODE转换的情况下进行此操作。

供参考: https://wiki.libsdl.org/SDL_GetKeyboardState

另外,我应该指出SDL_SCANCODE_TO_KEYCODE不是通用转换宏。它只是设置一个高位,以便某些扫描码可以是唯一的。使用SDL_GetKeyFromScancodeSDL_GetScancodeFromKey

答案 1 :(得分:0)

当我直接使用密钥代码而不是转换扫描码

时工作
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];
}