c++ - 当按键仍然按下时触发 SDL_KEYUP

标签 c++ sdl sdl-2

我正在 C++ 中使用 SDL2 来创建 Sprite 。但是,当我按下按键时,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 将开始生成“假”按键按下和按键抬起事件。

这主要用于文本编辑,但除此之外几乎没有什么用处。

忽略所有具有 event.key.repeat != 0 的键盘事件。


此外,如果您正在编写游戏,您可能需要使用扫描码而不是键码(例如 event.key.keysym.scancode == SDL_SCANCODE_A 而不是 event.key。 keysym.sym == SDLK_a)。

键码取决于当前布局,而扫描码则不然。扫描码代表物理按键位置。如果您使用非 QWERTY 布局,差异会很明显。 (例如,SDLK_z 始终绑定(bind)到印有 Z 的按键,而 SDL_SCANCODE_W 绑定(bind)到 W在 QWERTY 上,在 AZERTY 上使用 Z。)

关于c++ - 当按键仍然按下时触发 SDL_KEYUP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59725849/

相关文章:

c++ - 获取 C2760 语法错误:意外标记 'int',std::max<int>(...) 预期为 'expression'

c++ - 名称查找 - 运算符>>未找到

c++ - 如何根据接收到的值获取变量名?

linux - 如何在您的程序 (Linux) 中包含 SDL。对 SDL_Init() 的 undefined reference

c++ - std::vector::erase() 应该销毁被删除的元素吗? (而不是最后一个元素)

c++ - SDL 纹理数组?

c++ - 在 C/C++ 中使用 SDL2_gfx 绘制实心圆

c++ - 如何从 SDL_TEXTINPUT 获取 utf-8 输入?

c - 如何在使用 SDL2 的程序中查找 valgrind 检测到的内存错误的原因

c++ - SDL(和其他)虚拟键输入