Хоча ви можете реалізувати це за допомогою 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
події так, ніби миша не обмежувалася всередині вікна.