SDL_KEYUP 当按键仍然按下时触发
SDL_KEYUP triggered when key is still down
我正在使用 C++ 中的 SDL2 创建精灵。但是,当我按下该键时,SDL_KEYUP 会不断触发。
void update() override {
if(Game::event.type == SDL_KEYDOWN) {
switch(Game::event.key.keysym.sym) {
case SDLK_z:
cout << "key down" << endl;
break;
default:
break;
}
}
if(Game::event.type == SDL_KEYUP) {
switch(Game::event.key.keysym.sym) {
case SDLK_z:
cout << "Key up" << endl;
break;
default:
break;
}
}
}
这是一项功能,而不是错误。如果您按住一个键半秒钟左右,SDL 将开始生成 "fake" 按键按下和按键弹起事件。
这主要用于文本编辑,但在其他方面几乎没有用。
忽略所有具有 event.key.repeat != 0
.
的键盘事件
此外,如果您正在编写游戏,您可能希望使用扫描码而不是键码(例如 event.key.keysym.scancode == SDL_SCANCODE_A
而不是 event.key.keysym.sym == SDLK_a
)。
键码取决于当前布局,而扫描码则不然。扫描码代表物理关键位置。如果您使用非 QWERTY 布局,差异会很明显。 (例如,SDLK_z
始终绑定到上面印有 Z
的键,而 SDL_SCANCODE_W
绑定到 QWERTY 上的 W
和 AZERTY 上的 Z
。)
我正在使用 C++ 中的 SDL2 创建精灵。但是,当我按下该键时,SDL_KEYUP 会不断触发。
void update() override {
if(Game::event.type == SDL_KEYDOWN) {
switch(Game::event.key.keysym.sym) {
case SDLK_z:
cout << "key down" << endl;
break;
default:
break;
}
}
if(Game::event.type == SDL_KEYUP) {
switch(Game::event.key.keysym.sym) {
case SDLK_z:
cout << "Key up" << endl;
break;
default:
break;
}
}
}
这是一项功能,而不是错误。如果您按住一个键半秒钟左右,SDL 将开始生成 "fake" 按键按下和按键弹起事件。
这主要用于文本编辑,但在其他方面几乎没有用。
忽略所有具有 event.key.repeat != 0
.
此外,如果您正在编写游戏,您可能希望使用扫描码而不是键码(例如 event.key.keysym.scancode == SDL_SCANCODE_A
而不是 event.key.keysym.sym == SDLK_a
)。
键码取决于当前布局,而扫描码则不然。扫描码代表物理关键位置。如果您使用非 QWERTY 布局,差异会很明显。 (例如,SDLK_z
始终绑定到上面印有 Z
的键,而 SDL_SCANCODE_W
绑定到 QWERTY 上的 W
和 AZERTY 上的 Z
。)