ฉันเจอปัญหานี้ด้วย Xbox Controller Input แม้ว่าจะไม่เหมือนกัน แต่มันก็ค่อนข้างคล้ายกัน คุณสามารถเปลี่ยนรหัสในตัวอย่างของฉันเพื่อให้เหมาะกับความต้องการของคุณ
แก้ไข: สถานการณ์ของคุณจะใช้สิ่งนี้ ->
https://docs.microsoft.com/en-us/windows/desktop/api/winuser/ns-winuser-tagrawmouse
และคุณสามารถเรียนรู้วิธีสร้างคลาสอินพุตดิบผ่าน ->
https://docs.microsoft.com/en-us/windows/desktop/inputdev/raw-input
แต่ .. ตอนนี้เข้าสู่อัลกอริธึมที่ยอดเยี่ยมที่สุด ... ไม่ได้จริงๆ แต่เฮ้ .. มันเจ๋งมาก :)
* ดังนั้น ... เราสามารถเก็บสถานะของปุ่มทุกปุ่มซึ่งถูกกดวางจำหน่ายและกดลง !!! นอกจากนี้เรายังสามารถตรวจสอบเวลาการถือครองได้ แต่ต้องใช้คำสั่ง if เพียงคำสั่งเดียวและสามารถตรวจสอบจำนวนปุ่มใด ๆ ได้ แต่มีกฎบางอย่างดูด้านล่างสำหรับข้อมูลนี้
เห็นได้ชัดว่าถ้าเราต้องการตรวจสอบว่ามีอะไรกดปล่อย ฯลฯ คุณจะทำ "ถ้า (นี่) {}" แต่นี่คือการแสดงว่าเราสามารถรับสถานะกดแล้วปิดมันในเฟรมถัดไปเพื่อให้คุณ " ismousepressed "จะเป็นเท็จในครั้งต่อไปที่คุณตรวจสอบ
รหัสแบบสมบูรณ์ที่นี่:
https://github.com/JeremyDX/DX_B/blob/master/DX_B/XGameInput.cpp
มันทำงานอย่างไร..
ดังนั้นฉันไม่แน่ใจว่าค่าที่คุณได้รับเมื่อคุณแสดงให้เห็นว่ามีการกดปุ่มหรือไม่ แต่โดยทั่วไปเมื่อฉันโหลดใน XInput ฉันได้รับค่า 16 บิตระหว่าง 0 ถึง 65535 ซึ่งมีสถานะเป็นไปได้ 15 บิตสำหรับ "กด"
ปัญหาคือทุกครั้งที่ฉันตรวจสอบสิ่งนี้มันจะให้ข้อมูลสถานะปัจจุบันแก่ฉัน ฉันต้องการวิธีในการแปลงสถานะปัจจุบันเป็นค่ากดปล่อยและเก็บค่า
ดังนั้นสิ่งที่ฉันทำคือต่อไปนี้
ก่อนอื่นเราจะสร้างตัวแปร "CURRENT" ทุกครั้งที่เราตรวจสอบข้อมูลนี้เราตั้งค่า "หมุนเวียน" เป็นตัวแปร "ก่อนหน้า" แล้วเก็บข้อมูลใหม่เป็น "ปัจจุบัน" ตามที่เห็นที่นี่ ->
uint64_t LAST = CURRENT;
CURRENT = gamepad.wButtons;
ด้วยข้อมูลนี้ที่นี่มันเป็นที่ที่น่าตื่นเต้น !!
ตอนนี้เราสามารถทราบได้ว่าปุ่มใดที่ถูกกดลง!
BUTTONS_HOLD = LAST & CURRENT;
สิ่งนี้จะเป็นพื้นมันเปรียบเทียบสองค่าและกดปุ่มใด ๆ ที่แสดงในทั้งสองจะอยู่ 1 และทุกอย่างอื่นตั้งเป็น 0
Ie (1 | 2 | 4) & (2 | 4 | 8) จะให้ผลตอบแทน (2 | 4)
ตอนนี้เรามีปุ่มใดที่ "HELD" ลง เราสามารถรับส่วนที่เหลือ
กดง่ายมากเราใช้สถานะ "CURRENT" และลบปุ่มค้างไว้
BUTTONS_PRESSED = CURRENT ^ BUTTONS_HOLD;
การเปิดตัวเป็นสิ่งเดียวที่เราเปรียบเทียบกับรัฐสุดท้ายของเราแทน
BUTTONS_RELEASED = LAST ^ BUTTONS_HOLD;
ดูที่สถานการณ์ที่กด ถ้าสมมุติว่าเรามี 2 | 4 | กด 8 ครั้ง เราพบว่า 2 | 4 ที่จัดขึ้น เมื่อเราลบ Held Bits ออกเราจะเหลือเพียง 8 เท่านั้นนี่คือบิตที่ถูกกดใหม่สำหรับรอบนี้
สามารถนำไปใช้สำหรับปล่อยได้เช่นเดียวกัน ในสถานการณ์นี้ "LAST" ถูกตั้งค่าเป็น 1 | 2 | 4. ดังนั้นเมื่อเราลบ 2 | 4 บิต เราเหลือ 1 ข้อดังนั้นปุ่ม 1 จึงถูกนำออกใช้ตั้งแต่เฟรมสุดท้าย
สถานการณ์ด้านบนนี้อาจเป็นสถานการณ์ที่เหมาะสมที่สุดที่คุณสามารถนำเสนอสำหรับการเปรียบเทียบบิตและให้ข้อมูล 3 ระดับโดยไม่มีถ้ามีคำสั่งหรือสำหรับการวนรอบเพียง 3 บิตการคำนวณอย่างรวดเร็ว
ฉันยังต้องการจัดเก็บเอกสารข้อมูลดังนั้นแม้ว่าสถานการณ์ของฉันจะไม่สมบูรณ์ ... สิ่งที่เราทำคือตั้งค่าโฮลด์บิตที่เราต้องการตรวจสอบ
ดังนั้นทุกครั้งที่เราตั้งค่าข้อมูล Press / Release / Hold เราตรวจสอบว่าข้อมูลการพักยังคงเท่ากับการตรวจสอบบิตปัจจุบัน หากเราไม่รีเซ็ตมันก็ถึงเวลาปัจจุบัน ในกรณีของฉันฉันตั้งให้เฟรมดัชนีดังนั้นฉันรู้ว่ามันถูกระงับไว้กี่เฟรม
ข้อเสียของวิธีการนี้คือฉันไม่สามารถรับเวลาการพักรายบุคคลได้ แต่คุณสามารถตรวจสอบหลายบิตพร้อมกันได้ นั่นคือถ้าฉันตั้งบิตค้างไว้ที่ 1 | 16 ถ้าทั้ง 1 หรือ 16 ไม่ถูกระงับสิ่งนี้จะล้มเหลว ดังนั้นจึงต้องการให้ปุ่มเหล่านั้นทั้งหมดถูกกดค้างไว้เพื่อดำเนินการฟ้องร้องต่อไป
จากนั้นถ้าคุณดูในรหัสคุณจะเห็นการเรียกใช้ฟังก์ชันที่เรียบร้อยทั้งหมด
ตัวอย่างของคุณจะลดลงเหลือเพียงแค่ตรวจสอบว่ามีการกดปุ่มเกิดขึ้นหรือไม่และการกดปุ่มสามารถเกิดขึ้นได้เพียงครั้งเดียวด้วยอัลกอริทึมนี้ ในการตรวจสอบครั้งต่อไปเพื่อกดมันจะไม่มีอยู่เนื่องจากคุณไม่สามารถกดได้อีกแล้วเมื่อคุณต้องการปล่อยก่อนที่คุณจะกดอีกครั้ง