Отключить буфер событий SDL2 при удержании клавиши нажатой

#c #input #keyboard #sdl

#c #ввод #клавиатура #sdl

Вопрос:

В настоящее время я разрабатываю серверно-клиентскую игру, и у меня возникли проблемы с очередью событий SDL2. Для перемещения символа используется следующий код:

 void handleEvent( SDL_Eventamp; e) {

    if( e.type == SDL_KEYDOWN ) {

        switch( e.key.keysym.sym ) {

            case SDLK_LEFT:
                // Do something and send key to server
                break;

            case SDLK_RIGHT:
                // Do something and send key to server
                break;

            case SDLK_UP:
                // Do something and send key to server
                break;
        }
    }

    else if( e.type == SDL_KEYUP ) {

        switch( e.key.keysym.sym ) {

            case SDLK_LEFT:
                // Do something and send key to server
                break;

            case SDLK_RIGHT:
                // Do something and send key to server
                break;

            case SDLK_UP:
                // Do something and send key to server
                break;
        }

    }
}
  

Кажется, существует какой-то буфер событий, когда клавиша удерживается нажатой. В принципе, если я быстро нажимаю клавиши со стрелками, ключи мгновенно отправляются на сервер. Но когда я удерживаю стрелку, я мгновенно получаю только одно ключевое сообщение (начальное нажатие), и через 200 мс я начинаю получать поток ключей. Поведение, к которому я стремлюсь, заключается в том, чтобы всегда получать поток нажатой клавиши в это время как можно скорее.

Я намеренно избегаю использования (e.key.repeat == 0), потому что мне нужно отправлять каждое нажатие клавиши на сервер, чтобы правильно обновлять положение объекта символьной логики сервера.

Комментарии:

1. Повторение ключа обычно контролируется операционной системой, как начальная задержка, так и интервал повторения. Вы получаете такое же поведение в текстовом редакторе, если вы удерживаете клавишу. Вы можете игнорировать повторяющиеся события и генерировать все, что хотите, с фиксированными интервалами, полагаясь только на события нажатия / выпуска.