#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. Повторение ключа обычно контролируется операционной системой, как начальная задержка, так и интервал повторения. Вы получаете такое же поведение в текстовом редакторе, если вы удерживаете клавишу. Вы можете игнорировать повторяющиеся события и генерировать все, что хотите, с фиксированными интервалами, полагаясь только на события нажатия / выпуска.