Отключить обнаружение мыши / курсора

#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. Хорошо, спасибо, прямо сейчас движение лучше, а не проблема с «мышью»