Während Sie dies mit SDL_WarpCursor () implementieren können, sind auf einigen Plattformen Probleme mit dieser Methode aufgetreten. Ich hatte echte Probleme mit einigen Plattformen, die die WarpCursor () - Aktion nicht zuverlässig ausführten, insbesondere, wenn ich sie für jeden Frame aufgerufen habe.
Denken Sie auch daran, dass der Cursor auf vielen Plattformen mit einer höheren Häufigkeit als Ihre App behandelt wird. Dies gilt insbesondere, wenn Sie unter 60 fps laufen! Selbst wenn die Plattform die Maus in jedem Frame Ihres Spiels erfolgreich verzieht, kann der Cursor dennoch von Ihrem Fenster entfernt werden, wenn Aktualisierungen zwischen Ihren gerenderten Frames empfangen werden.
Die korrekte Methode zum Einfangen der Maus unter SDL lautet:
SDL_WM_GrabInput( SDL_GRAB_ON );
Dies teilt SDL mit, dass Sie beabsichtigen, die vollständige Kontrolle über Maus und Tastatur zu erlangen (siehe Dokumentation ) und die Maus daher unabhängig von der jeweiligen Situation im Fenster zu lassen. Ab diesem Zeitpunkt bewegt sich die Maus unabhängig von Ihrer Framerate nicht mehr außerhalb des Fensters, und Sie sollten SDL_WarpCursor nicht mehr aufrufen, es sei denn, Sie möchten den Cursor tatsächlich irgendwohin teleportieren, anstatt ihn ständig zu spammen.
In diesem "Grabbing" -Modus empfangen Sie weiterhin Mausbewegungsereignisse, als wäre die Maus im Fenster nicht eingeschränkt. (Wenn sich der Cursor also am rechten Bildschirmrand befindet und der Benutzer die Maus weiter nach rechts bewegt, wird ein Mausbewegungsereignis angezeigt, das die Bewegung nach rechts anzeigt, die Cursorposition ändert sich jedoch nicht.) Dies ist sehr nützlich, wenn Sie beispielsweise die Steuerelemente für FPS-Spiele drehen, bei denen Sie sich nur um die relative Bewegung des Cursors und nicht um seine absolute Position kümmern.
Update für SDL2 - 9. Dezember 2013
Diese Schnittstelle wurde für SDL2 geändert. Wenn Sie SDL1.2 verwenden, ist die obige Antwort immer noch korrekt. Unter SDL2 ist die SDL_WM_GrabInput(SDL_GrabMode)
Funktion jedoch nicht mehr verfügbar. SDL2 bietet die folgenden neuen Möglichkeiten zum Erfassen der Maus:
SDL_SetRelativeMouseMode(SDL_TRUE);
Ansonsten ist dies identisch mit der vorherigen Funktion - in diesem Modus werden weiterhin SDL_MOUSEMOTION
Ereignisse empfangen , als ob die Maus nicht innerhalb des Fensters eingeschränkt wäre.