ฉันมีปัญหากับการแก้ไขการชนของ AABB
ฉันแก้ไขทางแยก AABB โดยการแก้ไขแกน X ก่อนแล้วตามด้วยแกน Y สิ่งนี้ทำเพื่อป้องกันข้อผิดพลาดนี้: http://i.stack.imgur.com/NLg4j.png
วิธีการปัจจุบันทำงานได้ดีเมื่อวัตถุเคลื่อนที่เข้าสู่เครื่องเล่นและผู้เล่นจะต้องถูกผลักในแนวนอน อย่างที่คุณเห็นใน. gif แหลมแนวนอนผลักผู้เล่นอย่างถูกต้อง
เมื่อหนามแหลมแนวตั้งเคลื่อนที่เข้าหาผู้เล่นแกน X จะยังคงได้รับการแก้ไขก่อน สิ่งนี้ทำให้ "ใช้เดือยเป็นยก" เป็นไปไม่ได้
เมื่อผู้เล่นย้ายเข้ามาในแนวดิ่งแหลม (ได้รับผลกระทบจากแรงโน้มถ่วงตกเข้าไปในพวกเขา) เขาผลักแกน Y เพราะไม่มีการทับซ้อนกันบนแกน X เพื่อเริ่มต้น
สิ่งที่ฉันลองใช้เป็นวิธีที่อธิบายไว้ในคำตอบแรกของลิงค์นี้: การตรวจจับการชนกันของวัตถุสี่เหลี่ยม 2 มิติ
อย่างไรก็ตามสไปค์และวัตถุที่กำลังเคลื่อนที่จะเคลื่อนที่โดยการเปลี่ยนตำแหน่งของมันไม่ใช่ความเร็วและฉันจะไม่คำนวณตำแหน่งที่คาดการณ์ถัดไปจนกว่าจะมีการเรียกเมธอด Update () จำเป็นต้องพูดวิธีนี้ไม่ได้ผลเช่นกัน :(
ฉันต้องแก้ปัญหาการชนกันของ AABB ในแบบที่ทั้งสองกรณีที่อธิบายไว้ข้างต้นทำงานได้ตามที่ตั้งใจไว้
นี่คือรหัสที่มาการชนกันของฉันในปัจจุบัน: http://pastebin.com/MiCi3nA1
ฉันรู้สึกขอบคุณจริง ๆ ถ้ามีคนสามารถตรวจสอบเรื่องนี้ได้เนื่องจากข้อผิดพลาดนี้ปรากฏอยู่ในเครื่องยนต์ตั้งแต่ต้นและฉันพยายามดิ้นรนเพื่อหาทางออกที่ดีโดยไม่ประสบความสำเร็จ สิ่งนี้ทำให้ฉันใช้เวลาหลายคืนในการดูรหัสการชนและป้องกันไม่ให้ฉันไปที่ "ส่วนที่สนุกสนาน" และเข้ารหัสตรรกะของเกม :(
ฉันพยายามใช้ระบบการชนกันเช่นเดียวกับในการสาธิตแพลตฟอร์ม XNA AppHub (โดยการคัดลอกวางสิ่งของส่วนใหญ่) อย่างไรก็ตามข้อผิดพลาด "กระโดด" เกิดขึ้นในเกมของฉันในขณะที่มันไม่ได้เกิดขึ้นในการสาธิต AppHub [กระโดดบั๊ก: http://i.stack.imgur.com/NLg4j.png ]
หากต้องการข้ามฉันจะตรวจสอบว่าผู้เล่นเป็น "onGround" หรือไม่จากนั้นเพิ่ม -5 ใน Velocity.Y
เนื่องจาก Velocity.X ของผู้เล่นนั้นสูงกว่า Velocity.Y (อ้างอิงจากพาเนลที่สี่ในแผนภาพ) onGround ถูกตั้งค่าเป็นจริงเมื่อไม่ควรทำดังนั้นจึงอนุญาตให้ผู้เล่นกระโดดกลางอากาศได้
ฉันเชื่อว่าสิ่งนี้จะไม่เกิดขึ้นในการสาธิต AppHub เพราะ Velocity.X ของผู้เล่นจะไม่สูงกว่า Velocity.Y แต่ฉันอาจเข้าใจผิด
ฉันแก้ไขสิ่งนี้ก่อนโดยการแก้ไขบนแกน X ก่อนจากนั้นบนแกน Y แต่นั่นทำให้เกิดการชนกับสไปค์ดังที่ฉันได้กล่าวไว้ข้างต้น