Bien que vous puissiez implémenter cela à l'aide de SDL_WarpCursor (), j'ai rencontré des problèmes avec cette méthode sur certaines plates-formes. J'ai rencontré de réels problèmes avec certaines plateformes qui n'effectuaient pas de manière fiable l'action WarpCursor (), en particulier lorsque je l'appelais à chaque image.
N'oubliez pas également que sur de nombreuses plates-formes, le curseur est géré à une fréquence plus élevée que votre application. Cela est particulièrement vrai si vous utilisez moins de 60 images par seconde! Ainsi, même si la plate-forme déforme avec succès la souris sur chaque image de votre jeu, le curseur peut toujours s'éloigner de votre fenêtre s'il reçoit des mises à jour entre vos images rendues.
La bonne méthode pour piéger la souris sous SDL est:
SDL_WM_GrabInput( SDL_GRAB_ON );
Cela indique à SDL que votre intention est de prendre le contrôle total de la souris + du clavier (voir la documentation ) et donc de garder la souris à l'intérieur de la fenêtre, quoi qu'il arrive. À partir de ce moment, la souris ne se déplacera pas en dehors de la fenêtre, quelle que soit votre fréquence d'images, et vous ne devez pas appeler SDL_WarpCursor, sauf si vous avez vraiment l'intention de téléporter le curseur quelque part, plutôt que de le spammer en continu.
En mode "capture", vous continuerez de recevoir les événements de mouvement de la souris comme si la souris n'était pas contrainte à l'intérieur de la fenêtre. (Donc, si le curseur se trouve sur le bord droit de l'écran et que l'utilisateur déplace sa souris plus à droite, vous recevrez un événement de mouvement de la souris indiquant un mouvement vers la droite, bien que la position du curseur ne change pas). Ceci est vraiment utile pour (par exemple) tourner les commandes des jeux FPS, où vous ne vous souciez que du mouvement relatif du curseur, pas de sa position absolue.
Mise à jour pour SDL2 - 9 décembre 2013
Cette interface a changé pour SDL2. Si vous utilisez SDL1.2, la réponse ci-dessus est toujours correcte. Cependant, sous SDL2, la SDL_WM_GrabInput(SDL_GrabMode)
fonction n'est plus disponible. La nouvelle façon de SDL2 de capturer la souris est:
SDL_SetRelativeMouseMode(SDL_TRUE);
Sinon, c'est identique à la fonction précédente - dans ce mode, vous continuerez à recevoir des SDL_MOUSEMOTION
événements comme si la souris n'était pas contrainte à l'intérieur de la fenêtre.