Хотя вы можете реализовать это с помощью SDL_WarpCursor (), у меня возникли проблемы с этим методом на некоторых платформах. У меня были реальные проблемы с некоторыми платформами, которые ненадежно выполняли действие WarpCursor (), особенно когда я вызывал его каждый кадр.
Также помните, что на многих платформах курсор обрабатывается с большей частотой, чем ваше приложение. Это особенно верно, если вы работаете ниже 60 кадров в секунду! Таким образом, даже если платформа успешно деформирует мышь на каждом кадре вашей игры, курсор все равно может покинуть ваше окно, если он получает обновления между вашими визуализированными кадрами.
Правильный метод отлова мыши под SDL:
SDL_WM_GrabInput( SDL_GRAB_ON );
Это говорит SDL, что вы намерены фактически получить полный контроль над мышью + клавиатурой (см. Документацию ) и, следовательно, держать мышь внутри окна, несмотря ни на что. С этого момента мышь не будет перемещаться за пределы окна, независимо от частоты кадров, и вам не следует вызывать SDL_WarpCursor, за исключением случаев, когда вы действительно намерены телепортировать курсор куда-то, а не спамить его непрерывно.
Находясь в этом режиме «захвата», вы продолжите получать события движения мыши, как будто мышь не была ограничена внутри окна. (Таким образом, если курсор находится на правом краю экрана, и пользователь перемещает свою мышь дальше вправо, вы получите событие движения мыши, показывающее движение вправо, хотя положение курсора не изменится). Это действительно полезно для (например) поворота элементов управления в играх FPS, где вас интересует только относительное движение курсора, а не его абсолютное положение.
Обновление для SDL2 - 9 декабря 2013 г.
Этот интерфейс был изменен для SDL2. Если вы используете SDL1.2, ответ выше по-прежнему правильный. Однако в SDL2 эта SDL_WM_GrabInput(SDL_GrabMode)
функция больше не доступна. Новый способ захвата мыши в SDL2:
SDL_SetRelativeMouseMode(SDL_TRUE);
В противном случае это идентично предыдущей функции - в этом режиме вы продолжите получать SDL_MOUSEMOTION
события, как будто мышь не была ограничена внутри окна.