जब आप SDL_WarpCursor () का उपयोग करके इसे लागू कर सकते हैं, तो मैंने कुछ प्लेटफार्मों पर उस पद्धति के साथ समस्याओं में चला दिया है। मुझे कुछ प्लेटफ़ॉर्म के साथ वास्तविक समस्याएं हैं, जो मज़बूती से WarpCursor () कार्रवाई नहीं कर रही हैं, खासकर जब मैं इसे हर फ्रेम पर बुला रहा हूं।
यह भी याद रखें कि कई प्लेटफार्मों पर, कर्सर को आपके ऐप की तुलना में उच्च आवृत्ति पर नियंत्रित किया जाता है। यदि आप 60fps से नीचे चल रहे हैं तो यह विशेष रूप से सच है! इसलिए भले ही प्लेटफ़ॉर्म आपके गेम के हर फ्रेम पर माउस को सफलतापूर्वक घुमा रहा हो, अगर यह आपके रेंडर फ्रेम के बीच अपडेट प्राप्त कर रहा है, तो भी कर्सर आपकी विंडो से दूर जा सकता है।
एसडीएल के तहत माउस को फंसाने की सही विधि है:
SDL_WM_GrabInput( SDL_GRAB_ON );
यह एसडीएल को बताता है कि आपका इरादा वास्तव में माउस + कीबोर्ड ( प्रलेखन देखें ) का पूर्ण नियंत्रण हथियाना है , और इसलिए खिड़की के अंदर माउस को रखें चाहे कोई भी हो। इस बिंदु से, माउस आपके फ्रेम दर की परवाह किए बिना खिड़की से बाहर नहीं जाएगा, और आपको SDL_WarpCursor को कॉल नहीं करना चाहिए, सिवाय इसके कि क्या आप वास्तव में कर्सर को टेलीपोर्ट करना चाहते हैं, बजाय इसे लगातार स्पैम करने के।
इस "हथियाने" मोड में, आप माउस गति की घटनाओं को प्राप्त करना जारी रखेंगे, हालांकि माउस को खिड़की के अंदर बाधित नहीं किया जा रहा था। (इसलिए यदि कर्सर स्क्रीन के दाहिने किनारे पर है, और उपयोगकर्ता अपने माउस को और दाईं ओर ले जाता है, तो आपको माउस मोशन ईवेंट प्राप्त होगा जो दाईं ओर गति दिखाएगा, हालांकि कर्सर की स्थिति नहीं बदलेगी)। यह एफपीएस गेम्स के लिए नियंत्रण के लिए उदाहरण के लिए (उदाहरण के लिए) वास्तव में उपयोगी है, जहां आप केवल कर्सर की सापेक्ष गति के बारे में परवाह करते हैं, न कि इसकी पूर्ण स्थिति।
एसडीएल 2 के लिए अपडेट - 9 दिसंबर, 2013
यह इंटरफ़ेस SDL2 के लिए बदल गया है। यदि आप SDL1.2 का उपयोग कर रहे हैं, तो ऊपर दिया गया उत्तर अभी भी सही है। हालाँकि, SDL2 के तहत SDL_WM_GrabInput(SDL_GrabMode)
फ़ंक्शन अब उपलब्ध नहीं है। SDL2 माउस को पकड़ने का नया तरीका है:
SDL_SetRelativeMouseMode(SDL_TRUE);
अन्यथा, यह पहले के फ़ंक्शन के समान है - इस मोड में आप SDL_MOUSEMOTION
ईवेंट प्राप्त करना जारी रखेंगे, हालांकि माउस को विंडो के अंदर बाधित नहीं किया गया था।