Embora você possa implementar isso usando SDL_WarpCursor (), eu tive problemas com esse método em algumas plataformas. Eu tive problemas reais com algumas plataformas que não executam com confiabilidade a ação WarpCursor (), principalmente quando a chamo de todos os quadros.
Além disso, lembre-se de que em muitas plataformas, o cursor é tratado com uma frequência mais alta que o seu aplicativo. Isto é particularmente verdade se você estiver executando abaixo de 60fps! Portanto, mesmo que a plataforma entorte com sucesso o mouse em todos os quadros do seu jogo, o cursor ainda poderá sair da sua janela se estiver recebendo atualizações entre os quadros renderizados.
O método correto para interceptar o mouse no SDL é:
SDL_WM_GrabInput( SDL_GRAB_ON );
Isso informa à SDL que sua intenção é realmente obter o controle total do mouse + teclado (consulte a documentação ) e, portanto, manter o mouse dentro da janela, não importa o quê. A partir deste momento, o mouse não se moverá para fora da janela, independentemente da sua taxa de quadros, e você não deve ligar para SDL_WarpCursor, exceto se realmente pretende teleportar o cursor para algum lugar, em vez de enviá-lo continuamente.
Enquanto estiver no modo "agarrar", você continuará recebendo eventos de movimento do mouse como se o mouse não estivesse sendo restringido dentro da janela. (Portanto, se o cursor estiver na borda direita da tela e o usuário mover o mouse mais para a direita, você receberá um evento de movimento do mouse mostrando o movimento para a direita, embora a posição do cursor não seja alterada). Isso é realmente útil para (por exemplo) girar controles para jogos de FPS, onde você se importa apenas com o movimento relativo do cursor, não com sua posição absoluta.
Atualização para SDL2 - 9 de dezembro de 2013
Essa interface foi alterada para SDL2. Se você estiver usando o SDL1.2, a resposta acima ainda está correta. No entanto, no SDL2, a SDL_WM_GrabInput(SDL_GrabMode)
função não está mais disponível. A nova maneira de capturar o mouse do SDL2 é:
SDL_SetRelativeMouseMode(SDL_TRUE);
Caso contrário, isso é idêntico à função anterior - nesse modo, você continuará recebendo SDL_MOUSEMOTION
eventos como se o mouse não estivesse sendo restringido dentro da janela.