Meskipun Anda dapat menerapkan ini menggunakan SDL_WarpCursor (), saya mengalami masalah dengan metode itu pada beberapa platform. Saya punya masalah nyata dengan beberapa platform yang tidak dapat diandalkan melakukan aksi WarpCursor (), terutama ketika saya menyebutnya setiap frame.
Juga, ingat bahwa pada banyak platform, kursor ditangani pada frekuensi yang lebih tinggi daripada aplikasi Anda. Ini terutama benar jika Anda menjalankan di bawah 60fps! Jadi, bahkan jika platform berhasil membengkokkan mouse di setiap frame game Anda, kursor masih bisa menjauh dari jendela Anda jika ia menerima pembaruan di antara frame yang Anda render.
Metode yang benar untuk menjebak mouse di bawah SDL adalah:
SDL_WM_GrabInput( SDL_GRAB_ON );
Ini memberi tahu SDL bahwa niat Anda adalah untuk benar-benar mengambil kendali penuh atas keyboard + mouse (lihat dokumentasi ), dan untuk itu menjaga mouse tetap berada di dalam jendela tidak peduli apa pun yang terjadi. Mulai saat ini, mouse tidak akan bergerak di luar jendela, terlepas dari kecepatan bingkai Anda, dan Anda tidak boleh memanggil SDL_WarpCursor, kecuali jika Anda benar-benar berniat untuk memindahkan kursor ke suatu tempat, alih-alih mengirim spam secara terus-menerus.
Saat berada dalam mode "grabbing", Anda akan terus menerima aktivitas gerakan mouse seolah-olah mouse tidak dibatasi di dalam jendela. (Jadi, jika kursor berada di tepi kanan layar, dan pengguna menggerakkan mouse lebih jauh ke kanan, Anda akan menerima acara gerakan mouse yang menunjukkan gerakan ke kanan, meskipun posisi kursor tidak akan berubah). Ini sangat berguna untuk (misalnya) memutar kontrol untuk game FPS, di mana Anda hanya peduli pada gerakan relatif kursor, bukan posisi absolutnya.
Pembaruan untuk SDL2 - 9 Desember 2013
Antarmuka ini telah berubah untuk SDL2. Jika Anda menggunakan SDL1.2, jawaban di atas masih benar. Namun, di bawah SDL2 SDL_WM_GrabInput(SDL_GrabMode)
fungsi tidak tersedia lagi Cara baru SDL2 untuk menangkap mouse adalah:
SDL_SetRelativeMouseMode(SDL_TRUE);
Jika tidak, ini identik dengan fungsi sebelumnya - dalam mode ini Anda akan terus menerima SDL_MOUSEMOTION
acara seolah-olah mouse tidak dibatasi di dalam jendela.