Search code examples
c++c++17sdl-2

Disable mouse / cursor detection


I'm making a simple Pong game.

When I ran the program, all the moves are perfect (the moving are not too fast nor too slow).

However, when I move my cursor around, the movement are faster which making the game much harder.

while (enable_loop)
        {
            Ticks = SDL_GetTicks();
            while (SDL_PollEvent(&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);
        }
    }

Note : I've tried SDL_Delay(5) but the movement are too junky and jumping around, not usable :/

This game does not require mouse and I just may plug out my mouse, but I'm asking this for my experience and knowledge purposes.

I've used SDL_ShowCursor(SDL_DISABLE), SDL_CaptureMouse(SDL_FALSE) and limit my FPS to 60.

The effect is lessen but still noticeable.

How do I disable mouse detection or any code that will stop the effect?


Solution

  • Move the keyPressed checks outside the SDL_PollEvent() loop:

    while (enable_loop)
    {
        Ticks = SDL_GetTicks();
        while (SDL_PollEvent(&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);
    }
    

    That way you're only processing keyboard input once per frame instead of once per event.