Очередь событий SDL

У меня есть следующий код, который
является частью некоторой функции, которая перемещает точку на экране.
Я использую SDL

if(SDL_PollEvent(&event)){

//BreakPoint A

if(event.type == SDL_KEYDOWN)
if(event.key.keysym.sym == SDLK_d){
goLeft = true;
//BreakPoint B
}
else if(event.type == SDL_KEYUP)
if(event.key.keysym.sym == SDLK_d){
goLeft = false;
//BreakPoint C
}
else{
//BreakPoint D
}

}

//BreakPoint E

//Move sprites and other things..
//Update  screen ..

Все это в цикле. Каждый раз, когда этот цикл выполняется, производятся вычисления для перемещения точки и отображается кадр.
Моя проблема в том, что когда я непрерывно нажимаю «D», после выхода из кнопки точка
не останавливается сразу.

изменения if(SDL_PollEvent(&event)){
в while(SDL_PollEvent(&event)){
все в порядке. Почему это происходит?

Одно из предположений состоит в том, что при непрерывном нажатии «D» очередь событий заполняется событиями ввода с клавиатуры. Так что многие из этих событий вставляются в очередь событий, и все это происходит в одном кадре рендеринга или одной итерации цикла. Я уже говорил выше, но в каждом кадре я удаляю только одно событие из очереди. Так что, когда я оставляю кнопку «D», события больше не вставляются, и происходит «дополнительное» перемещение, потому что для получения события, когда «D» было Освободить и обновить переменную goLeft. Сначала я должен удалить все те события, которые заполняли очередь по очереди. До тех пор, пока они не будут освобождены, точка будет двигаться.

Но с другой стороны, если у меня есть while(SDL_PollEvent(&event)){ и «D» постоянно нажата, выйдет ли когда-нибудь этот внутренний цикл? Поскольку этот цикл запускается, пока в очереди есть события, и, как я уже сказал, я постоянно вставляю их, нажимая «D».

РЕДАКТИРОВАТЬ

Как я сказал с циклом while, он работает нормально и фактически выходит из цикла. Как это происходит?
И из некоторых тестов, которые я сделал, я увидел, что при непрерывном нажатии «D» программа выполняется на каждой итерации внешнего цикла следующим образом:

  • BreakPoint A
  • BreakPoint B
  • BreakPoint A
  • BreakPoint C
  • BreakPoint E

1

Решение

Я тонко, я только что ответил на похожую проблему: События мыши SDL обрабатываются недостаточно быстро

Кажется, у вас возникла та же проблема, а именно ожидание vsync в середине цикла обработки событий. Если вы ожидаете, что события будут происходить непрерывно, вы можете сделать что-то вроде:

Uint32 timeout = SDL_GetTicks() + 10;
while(SDL_PollEvent(&events) && !SDL_TICKS_PASSED(SDL_GetTicks(), timeout)) {...}

Это будет гарантировать, что ваш цикл обработки событий не будет выполняться более 10 мс. Или вы можете иметь счетчик и убедиться, что вы не запускаете больше, чем «x» итераций.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]