मैं वास्तव में Xbox नियंत्रक इनपुट के साथ इस दुविधा में आया था। हालांकि नहीं बिल्कुल वही है जो बहुत समान है। आप अपनी आवश्यकताओं के अनुरूप मेरे उदाहरण में कोड बदल सकते हैं।
संपादित करें: आपकी स्थिति इसका उपयोग करेगी ->
https://docs.microsoft.com/en-us/windows/desktop/api/winuser/ns-winuser-tagrawmouse
और आप सीख सकते हैं कि कैसे - के माध्यम से एक कच्चा इनपुट वर्ग बनाया जाए
https://docs.microsoft.com/en-us/windows/desktop/inputdev/raw-input
लेकिन .. अब सुपर भयानक एल्गोरिथ्म पर ... वास्तव में नहीं, लेकिन हे .. यह बहुत अच्छा है :)
* तो: हम हर बटन के स्टेट्स को स्टोर कर सकते हैं और जो दबाए गए, जारी किए गए हैं, और हेल्ड डाउन !!! हम होल्डिंग टाइम की भी जांच कर सकते हैं, लेकिन यदि स्टेटमेंट के लिए सिंगल की आवश्यकता हो और किसी भी बटन की जांच कर सकते हैं, लेकिन इस जानकारी के नीचे कुछ नियम हैं।
जाहिर है अगर हम जांचना चाहते हैं कि क्या कुछ दबाया गया है, जारी किया गया है, आदि .. आप "अगर (यह) {}" करेंगे, लेकिन यह दिखा रहा है कि हम कैसे प्रेस राज्य प्राप्त कर सकते हैं और फिर इसे अगले फ्रेम से बंद कर सकते हैं ताकि आपका " ismousepressed "वास्तव में अगली बार जब आप चेक करेंगे तो गलत होगा।
पूरा कोड यहां:
https://github.com/JeremyDX/DX_B/blob/master/DX_B/XGameInput.cpp
यह काम किस प्रकार करता है..
इसलिए मुझे यकीन नहीं है कि जब आप एक बटन दबाते हैं या नहीं, तो आप जो मान प्राप्त करते हैं, वह मूल रूप से होता है, लेकिन मूल रूप से जब मैं XInput में लोड करता हूं तो मुझे 0 और 65535 के बीच 16 बिट मूल्य मिलता है। इसमें "दबाए गए" के लिए 15 बिट्स संभव अवस्थाएं हैं।
समस्या हर बार जब मैंने यह जाँच की तो यह मुझे सूचना की वर्तमान स्थिति बताएगी। मुझे वर्तमान स्थिति को दबाने, विमोचित करने और होल्ड वैल्यू में बदलने का एक तरीका चाहिए था।
तो मैंने जो किया वह निम्नलिखित है।
पहले हम एक "CURRENT" वैरिएबल बनाते हैं। हर बार जब हम इस डेटा की जाँच करते हैं तो हम "CURRENT" को "PREVIOUS" वैरिएबल पर सेट करते हैं और फिर नए डेटा को "Current" में स्टोर करते हैं जैसा कि यहाँ देखा गया है ->
uint64_t LAST = CURRENT;
CURRENT = gamepad.wButtons;
इस जानकारी के साथ यहाँ कहाँ रोमांचक है !!
अगर बटन दबाया जा रहा है तो हम अब पता लगा सकते हैं!
BUTTONS_HOLD = LAST & CURRENT;
यह क्या करता है यह मूल रूप से दो मूल्यों की तुलना करता है और दोनों में दिखाए गए किसी भी बटन प्रेस 1 और बाकी सब कुछ 0 पर सेट होगा।
Ie (1 | 2 | 4) और (2 | 4 | 8) की उपज होगी (2 | 4)।
अब हमारे पास कौन से बटन हैं जो "नीचे" हैं। हमें आराम मिल सकता है।
दबाया सरल है .. हम अपने "CURRENT" स्थिति को लेते हैं और किसी भी आयोजित बटन को हटा देते हैं।
BUTTONS_PRESSED = CURRENT ^ BUTTONS_HOLD;
विमोचन वही है जो हम इसकी तुलना अपने लास्ट स्टेट से करते हैं।
BUTTONS_RELEASED = LAST ^ BUTTONS_HOLD;
इसलिए दबाए गए हालात को देख रहे हैं। अगर मान लें कि वर्तमान में हमारे पास 2 | 4 | 8 दबाया। हमने पाया कि 2 | 4 जहां आयोजित किया गया। जब हम हेल्ड बिट्स को हटाते हैं तो हम केवल 8 के साथ रह जाते हैं। यह इस चक्र के लिए नया दबाया हुआ बिट है।
वही जारी के लिए आवेदन किया जा सकता है। इस परिदृश्य में "LAST" को 1 पर सेट किया गया था 2 | 4. इसलिए जब हम 2 हटाते हैं | 4 बिट्स। हम 1 के साथ बचे हैं। इसलिए अंतिम फ्रेम के बाद से बटन 1 जारी किया गया था।
यह उपरोक्त परिदृश्य शायद सबसे आदर्श स्थिति है जिसे आप बिट तुलना के लिए पेश कर सकते हैं और यह 3 स्तर डेटा प्रदान करता है यदि कोई कथन नहीं है या केवल 3 त्वरित बिट गणना के लिए है।
मैं डेटा होल्ड करना भी चाहता था, हालांकि मेरी स्थिति सही नहीं है ... यह क्या है कि हम मूल रूप से वे होल्डबिट सेट कर रहे हैं जिन्हें हम जांचना चाहते हैं।
इसलिए हर बार जब हम अपना प्रेस / रिलीज़ / होल्ड डेटा सेट करते हैं तो हम चेक करते हैं कि होल्ड डेटा अभी भी वर्तमान होल्ड बिट चेक के बराबर है या नहीं। यदि यह रीसेट नहीं करता है तो यह वर्तमान समय का समय है। मेरे मामले में मैं इसे इंडेक्स फ्रेम करने के लिए सेट कर रहा हूं इसलिए मुझे पता है कि इसके लिए कितने फ्रेम रखे गए हैं।
इस दृष्टिकोण के नकारात्मक पक्ष यह है कि मैं अलग-अलग होल्ड समय प्राप्त नहीं कर सकता, लेकिन आप एक साथ कई बिट्स की जांच कर सकते हैं। Ie अगर मैं पकड़ को 1 पर सेट करता हूँ | 16 या तो 1 या 16 आयोजित नहीं किया जाता है तो यह विफल हो जाएगा। इसलिए यह आवश्यक है कि टिकिंग जारी रखने के लिए उन सभी बटन को दबाए रखा जाए।
फिर यदि आप कोड में देखते हैं तो आपको सभी नीट फ़ंक्शन कॉल दिखाई देंगे।
इसलिए आपका उदाहरण केवल जाँचने के लिए कम हो जाएगा यदि एक बटन प्रेस हुआ और एक बटन प्रेस केवल इस एल्गोरिथ्म के साथ एक बार हो सकता है। प्रेस करने के लिए अगले चेक पर यह मौजूद नहीं होगा क्योंकि आप अधिक प्रेस नहीं कर सकते हैं, फिर एक बार आपको प्रेस करने से पहले जारी करना होगा।