#c #c 17 #sdl-2
Вопрос:
Я делаю простую игру в понг.
Когда я запускал программу, все движения были идеальными (движение не было ни слишком быстрым, ни слишком медленным).
Однако, когда я перемещаю курсор, движения становятся быстрее, что значительно усложняет игру.
while (enable_loop)
{
Ticks = SDL_GetTicks();
while (SDL_PollEvent(amp;any_event))
{
if (any_event.type == SDL_QUIT)
{
enable_loop = false;
}
// Process keyboard event
keyPressed = SDL_GetKeyboardState(NULL);
if (keyPressed[SDL_SCANCODE_ESCAPE])
{
enable_loop = false;
}
if (keyPressed[SDL_SCANCODE_UP] )
{
player2.Update(25);
}
if (keyPressed[SDL_SCANCODE_DOWN])
{
player2.Update(-25);
}
if (keyPressed[SDL_SCANCODE_W])
{
player1.Update(20);
}
if (keyPressed[SDL_SCANCODE_S])
{
player1.Update(-20);
}
}
Grouping.update(surface, background);
SDL_UpdateWindowSurface(window);
limitFPS(Ticks);
}
}
Примечание : я пробовал SDL_Delay(5)
, но движения слишком громоздкие и прыгающие, их нельзя использовать :/
Эта игра не требует мыши, и я просто могу подключить свою мышь, но я спрашиваю об этом в целях моего опыта и знаний.
Я использовал SDL_ShowCursor(SDL_DISABLE)
SDL_CaptureMouse(SDL_FALSE)
и ограничил свой FPS до 60.
Эффект уменьшается, но все еще заметен.
Как отключить обнаружение мыши или любой код, который остановит эффект?
Ответ №1:
Переместите keyPressed
проверки за пределы SDL_PollEvent()
цикла:
while (enable_loop)
{
Ticks = SDL_GetTicks();
while (SDL_PollEvent(amp;any_event))
{
if (any_event.type == SDL_QUIT)
{
enable_loop = false;
}
}
// Process keyboard event
keyPressed = SDL_GetKeyboardState(NULL);
if (keyPressed[SDL_SCANCODE_ESCAPE])
{
enable_loop = false;
}
if (keyPressed[SDL_SCANCODE_UP] )
{
player2.Update(25);
}
if (keyPressed[SDL_SCANCODE_DOWN])
{
player2.Update(-25);
}
if (keyPressed[SDL_SCANCODE_W])
{
player1.Update(20);
}
if (keyPressed[SDL_SCANCODE_S])
{
player1.Update(-20);
}
Grouping.update(surface, background);
SDL_UpdateWindowSurface(window);
limitFPS(Ticks);
}
Таким образом, вы обрабатываете ввод с клавиатуры только один раз за кадр, а не один раз за событие.
Комментарии:
1. В более общем плане физика происходит со временем, поэтому вы должны изменять переменные физического состояния в зависимости от времени (кадров).
2. Хорошо, спасибо, прямо сейчас движение лучше, а не проблема с «мышью»