ฉันใช้ C # และพยายามรับตำแหน่งเมาส์ฮาร์ดแวร์ สิ่งแรกที่ฉันลองคือฟังก์ชั่น XNA ง่าย ๆ ที่ใช้งานง่าย
Vector2 position = new Vector2(Mouse.GetState().X, Mouse.GetState().Y);
หลังจากนั้นฉันก็ทำการวาดเมาส์เช่นกันและเปรียบเทียบกับเมาส์ฮาร์ดแวร์ของ windows แล้วเมาส์ใหม่ที่มีพิกัด xna ที่ระบุนี้คือ "หยุดหย่อน" โดยที่ฉันหมายความว่ามันอยู่เบื้องหลังโดยไม่กี่เฟรม ตัวอย่างเช่นหากเกมทำงานที่ 600 fps คำสาปมันจะตอบสนอง แต่ที่ความล่าช้าของเมาส์ซอฟต์แวร์ 60 fps ไม่เป็นที่ยอมรับอีกต่อไป ดังนั้นฉันจึงลองใช้สิ่งที่ฉันคิดว่าเป็นเมาส์ฮาร์ดแวร์
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool GetCursorPos(out POINT lpPoint);
แต่ผลลัพธ์ก็เหมือนกันทุกประการ ฉันยังลองรับเคอร์เซอร์ของ Windows และนั่นก็เป็นจุดสิ้นสุดเช่นกัน - ใช้งานได้ แต่มีความล่าช้าเท่าเดิม ล้อเล่นกับฟังก์ชัน xna:
GraphicsDeviceManager.SynchronizeWithVerticalRetrace = true/false
Game.IsFixedTimeStep = true/fale
เปลี่ยนเวลาหน่วงด้วยเหตุผลที่ค่อนข้างชัดเจน แต่บรรทัดล่างคือไม่ว่ามันจะยังคงอยู่หลังเมาส์ Windows เริ่มต้น ฉันเคยเห็นในบางเกมว่าพวกเขามีตัวเลือกสำหรับเมาส์ที่ใช้ฮาร์ดแวร์และในเกมอื่น ๆ (ฉันคิดว่า) เป็นค่าเริ่มต้นแล้ว ทุกคนสามารถเป็นผู้นำในการทำสิ่งนั้นได้อย่างไร
Mouse.GetState()
ไม่เสียและตราบใดที่IsFixedTimeStep == true
ผู้คนไม่ควรเห็นความล่าช้าเว้นแต่จะเปรียบเทียบโดยตรงกับเมาส์หน้าต่างที่มองเห็นได้ อย่างไรก็ตามการตั้งค่า IsFixedTimeStep เป็น false ที่ framerate ต่ำกว่าจะปรากฏแก่ทุกคน เกี่ยวกับการป้อนข้อมูลโดยตรงฉันพิจารณาว่า posability (วิธีสุดท้าย)
Mouse.GetState()
จะพัง คุณแน่ใจหรือว่าคุณได้ตำแหน่งเม้าส์ในเฟรมเดียวกับที่คุณวาด นอกจากนี้โปรดจำไว้ว่าเคอร์เซอร์ Windows มีการเปิดใช้งานการเร่งความเร็ว / การชะลอความเร็วดังนั้นจึงรู้สึกตอบสนองได้ดีขึ้น หากคุณต้องการเข้าใกล้ฮาร์ดแวร์มากขึ้นคุณควรกด DirectInput ซึ่งจะทำให้เดลต้าเคลื่อนที่แทนตำแหน่งเมาส์แน่นอน แต่ฉันเชื่อว่าMouse.GetState()
ยังคงเป็นวิธีที่ถูกต้องใน XNA