SDL_KEYUP срабатывает, когда клавиша еще не нажата - PullRequest
1 голос
/ 14 января 2020

Я использую SDL2 в C ++ для создания спрайта. Однако 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;                    
                }
            }
        }

1 Ответ

2 голосов
/ 14 января 2020

Это особенность, а не ошибка. Если вы удерживаете клавишу в течение полсекунды или около того, SDL начнет генерировать «поддельные» события нажатия клавиш и нажатия клавиш.

Это используется в основном для редактирования текста, но в большинстве случаев бесполезно.

Игнорировать все события клавиатуры, которые имеют event.key.repeat != 0.


Кроме того, если вы пишете игру, вы можете использовать коды сканирования вместо кодов клавиш (например, event.key.keysym.scancode == SDL_SCANCODE_A вместо event.key.keysym.sym == SDLK_a).

Коды клавиш зависят от текущего макета, а коды сканирования - нет. Скан-коды представляют физические ключевые местоположения. Разница заметна, если вы используете макет не-QWERTY. (Например, SDLK_z всегда связан с ключом, на котором напечатано Z, в то время как SDL_SCANCODE_W связан с W в QWERTY и Z в AZERTY.)

...