Xbox thumbstick ที่ใช้ในการหมุนสไปรต์สูตรพื้นฐานทำให้มัน“ ติด” หรือรู้สึก“ เหนียว” ที่ระยะ 90 องศา! คุณจะหมุนอย่างราบรื่นได้อย่างไร?


9

ฉันใช้สูตรพื้นฐานมากในการคำนวณมุมของเทพดา (ยานอวกาศ) ที่ควรจะหันหน้าไปทางบนพื้นฐานของ thumbstick Xbox คอนโทรลเลอร์เช่นคุณใช้ thumbstick เพื่อหมุนเรือ

ในวิธีการอัพเดทหลักของฉัน:

shuttleAngle = (float) Math.Atan2(newGamePadState.ThumbSticks.Right.X, newGamePadState.ThumbSticks.Right.Y);

ในวิธีการวาดหลักของฉัน:

spriteBatch.Draw(shuttle, shuttleCoords, sourceRectangle, Color.White, shuttleAngle, origin, 1.0f, SpriteEffects.None, 1);

อย่างที่คุณเห็นมันค่อนข้างเรียบง่ายฉันเอาเรเดียนปัจจุบันจากนิ้วหัวแม่มือและเก็บมันไว้ในทุ่นshuttleAngleแล้วใช้นี่เป็นอาร์กิวเมนต์มุมการหมุน (เป็นเรเดียน) สำหรับวาดรูปกระสวย

ด้วยเหตุผลบางอย่างเมื่อฉันหมุน sprint มันให้ความรู้สึกเหนียวที่มุม 0, 90, 180 และ 270 องศา มันต้องการที่จะตั้งถิ่นฐานที่มุมเหล่านั้น มันไม่ให้การหมุนที่ราบรื่นและเป็นธรรมชาติเหมือนกับที่ฉันรู้สึกในเกมที่ใช้กลไกที่คล้ายคลึงกัน PS: ตัวควบคุม Xbox ของฉันไม่เป็นไร!


1
Atan2 ไม่ได้ใช้ค่า Y ก่อนจากนั้นค่า X msdn.microsoft.com/en-us/library/system.math.atan2.aspx คุณต้องสลับค่า x และ y ของคุณก่อน คุณคิดว่าการทำให้ค่าของคุณง่ายขึ้นด้วยการแก้ไขหรือไม่? toValue-value มูลค่า / ความเร็ว
Sidar

ขออภัยฉันหมายถึง newShuttleAngle - oldShuttleAngle / speed
Sidar

นั่นจะส่งผลต่อการวางแนวภาพเท่านั้นและขึ้นอยู่กับวิธีที่ภาพสำหรับพื้นผิวถูกจัดแนว - ฉันไม่เห็นว่าจะมีผลกระทบกับปัญหาของเขา
Joe Shanahan

Windows นี้หรือไม่ ถ้าตั้งค่าโครงการให้ใช้หน้าต่างคอนโซล (โครงการ -> ตัวเลือกโครงการ -> แอปพลิเคชั่น -> ประเภทเอาท์พุท) และพิมพ์มุมของคุณshuttleAngleเพื่อดูว่ามันติดอยู่ที่มุมเหล่านั้นหรือไม่
Joe Shanahan

2
ว้าวงานที่ยอดเยี่ยมบางคนเขียนขอบคุณและคนอื่น ๆ ฉันประทับใจกับเว็บไซต์นี้มากความคิดเห็นรวดเร็วมาก! มันเป็นโพสต์แรกของฉันดังนั้นบางคนได้โปรดบอกฉันว่าฉันต้องทำอย่างไรเพื่อให้เครดิตผู้ที่ช่วยฉันได้
ฮิวห์

คำตอบ:


18

อาจเป็นเพราะการทำงานของ DeadPad ของ GamePad มันเริ่มต้นGamePadDeadZone.IndependentAxesซึ่งหมายความว่าแต่ละแกนจะถูกตรวจสอบกับโซนที่ตายแล้วเป็นรายบุคคล สิ่งนี้มีแนวโน้มที่จะทำให้อินพุตเข้าสู่แต่ละแกนของ thumbstick แบบอะนาล็อก ให้ลองใช้GamePadDeadZone.Circular:

newGamePadState = GamePad.GetState(playerIndex, GamePadDeadZone.Circular);

สิ่งนี้จะช่วยให้คุณควบคุมแกนทั้งสองได้ราบรื่นขึ้น ตรวจสอบหน้า MSDNและบทความนี้โดย Shawn ฮาร์กรีฟ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.