У меня есть следующий код, который
является частью некоторой функции, которая перемещает точку на экране.
Я использую 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» программа выполняется на каждой итерации внешнего цикла следующим образом:
Я тонко, я только что ответил на похожую проблему: События мыши SDL обрабатываются недостаточно быстро
Кажется, у вас возникла та же проблема, а именно ожидание vsync в середине цикла обработки событий. Если вы ожидаете, что события будут происходить непрерывно, вы можете сделать что-то вроде:
Uint32 timeout = SDL_GetTicks() + 10;
while(SDL_PollEvent(&events) && !SDL_TICKS_PASSED(SDL_GetTicks(), timeout)) {...}
Это будет гарантировать, что ваш цикл обработки событий не будет выполняться более 10 мс. Или вы можете иметь счетчик и убедиться, что вы не запускаете больше, чем «x» итераций.
Других решений пока нет …