Mentre puoi implementarlo usando SDL_WarpCursor (), ho riscontrato problemi con quel metodo su alcune piattaforme. Ho avuto problemi reali con alcune piattaforme che non eseguivano in modo affidabile l'azione WarpCursor (), in particolare quando la chiamavo ogni frame.
Inoltre, ricorda che su molte piattaforme, il cursore viene gestito con una frequenza superiore rispetto alla tua app. Questo è particolarmente vero se corri sotto i 60 fps! Quindi, anche se la piattaforma deforma con successo il mouse su ogni frame del gioco, il cursore potrebbe comunque allontanarsi dalla finestra se riceve aggiornamenti tra i frame renderizzati.
Il metodo corretto per intrappolare il mouse in SDL è:
SDL_WM_GrabInput( SDL_GRAB_ON );
Questo dice a SDL che la tua intenzione è quella di ottenere il pieno controllo del mouse + tastiera (vedi la documentazione ), e quindi mantenere il mouse all'interno della finestra, non importa quale. Da questo punto in poi, il mouse non si sposterà fuori dalla finestra, indipendentemente dalla frequenza dei fotogrammi, e non dovresti chiamare SDL_WarpCursor, tranne se hai davvero intenzione di teletrasportare il cursore da qualche parte, anziché spammarlo continuamente.
In questa modalità di "acquisizione", continuerai a ricevere eventi di movimento del mouse come se il mouse non fosse vincolato all'interno della finestra. (Quindi se il cursore si trova sul bordo destro dello schermo e l'utente sposta il mouse più a destra, riceverai un evento di movimento del mouse che mostra il movimento a destra, sebbene la posizione del cursore non cambierà). Questo è davvero utile per (ad esempio) girare i controlli per i giochi FPS, dove ti preoccupi solo del movimento relativo del cursore, non della sua posizione assoluta.
Aggiornamento per SDL2 - 9 dicembre 2013
Questa interfaccia è stata modificata per SDL2. Se stai usando SDL1.2, la risposta sopra è ancora corretta. Tuttavia, in SDL2 la SDL_WM_GrabInput(SDL_GrabMode)
funzione non è più disponibile. Il nuovo modo di SDL2 per catturare il mouse è:
SDL_SetRelativeMouseMode(SDL_TRUE);
Altrimenti, questo è identico alla funzione precedente: in questa modalità continuerai a ricevere SDL_MOUSEMOTION
eventi come se il mouse non fosse vincolato all'interno della finestra.