ฉันจะจัดการการตรวจจับการชนกันของภาพสามมิติได้อย่างไร


14

ฉันต้องการสร้าง platformer สไตล์กระโดดมีมิติเท่ากัน ผู้เล่นควรจะสามารถกระโดดขึ้นไปบนแพลตฟอร์มเหนือพื้นตีด้านข้างของวัตถุ ฯลฯ

ฉันจะใช้เอ็นจิ้นเกม 2D ดังนั้นฉันไม่ต้องการเลียนแบบการชนกันของภาพสามมิติแบบเต็มสำหรับมิติที่ฉันไม่ได้ใช้

ฉันคิดว่าควรวางวัตถุในเกมโดยใช้: X, Y, ความกว้างความสูงและ Z สำหรับความลึก

การใช้ค่าเหล่านั้นฉันจะตรวจจับการชนได้อย่างไร


ฉันรู้ว่านี่เป็นคำถามทั่วไป แต่ฉันต้องการคำตอบที่ละเอียดมากขึ้นหรือเชื่อมโยงไปยังแหล่งเรียนรู้ที่ดี
jdeseno

คำตอบ:


19

2 ตัวเลือก:

  • คุณสามารถใช้เป็นเกมสามมิติด้วยกล้องออร์โธกราฟแบบคงที่ได้ จากนั้นคุณสามารถใช้ทรัพยากรเกม 3D มาตรฐาน / หนังสือ / บทช่วยสอน / ไลบรารี แม้ว่ามันจะถูกเรนเดอร์แบบ 2D แต่คณิตศาสตร์สำหรับการเคลื่อนไหวและอื่น ๆ ก็ยังคงเป็น 3D อยู่เบื้องหลัง สิ่งนี้จะให้ผลลัพธ์ที่แม่นยำที่สุดแก่คุณ

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


4

มีหลายวิธีที่คุณสามารถทำให้สิ่งนี้ง่ายขึ้น ตัวอย่างเช่นหากคุณไม่อนุญาตให้เลเยอร์ (ตัวอย่างเช่นสะพานที่คุณสามารถเดินข้ามและข้างล่างได้คุณสามารถทำการตรวจจับการชนทั้งหมดในมิติ X / Y ซึ่งคุณกรองการชนกันที่ตั้งไว้ที่ความสูง + ความลึก หรือสูงกว่า.


2

หากเกมนั้นใช้กริดสี่เหลี่ยมตารางนี้จะกำหนดแกน X / Y ของคุณ และ Z สามารถใช้สำหรับความสูง

การชนนั้นจะมากหรือน้อยกว่าง่ายเหมือนเกม 2 มิติแบบเรียงต่อกัน

จากนั้นคุณเพียงแค่ต้องแปลงจากกริดกลับไปเป็นพิกัดหน้าจอมีมิติเท่ากันเพื่อแสดงผล สิ่งนี้ค่อนข้างตรงไปตรงมา - แต่คุณอาจต้องคิดเกี่ยวกับการคำนวณค่า 'ความลึก' เพื่อใช้ในการเรียงลำดับ


การใช้ Z สำหรับความสูงนั้นขัดแย้งกับสัญชาตญาณ แต่มันเป็นสิ่งที่ถูกต้องที่จะทำเกม 2D จากบนลงล่าง จากนั้นคุณสามารถใช้รหัสซ้ำระหว่างเกมที่เล่นจากบนลงล่างและบนลงล่าง
เลน

2

Googling รอบ ๆ ฉันพบตัวอย่างนี้: http://planetskill.com/iso/

WASD เพื่อย้าย แถบพื้นที่เพื่อกระโดด

มันใช้การชนกับแกนขึ้น / ลงเท่านั้น แต่การเพิ่มการชนอื่น ๆ ควรเป็นเรื่องง่าย:

หากตำแหน่งขึ้น / ลงของขั้นตอนถัดไปสูงกว่าค่าสูงสุดของคุณเพียงแค่ไม่ย้าย วิธีนี้จะช่วยให้คุณสามารถกระโดดได้อย่างง่ายดาย

โค้ดตัวอย่างที่นี่: http://gist.github.com/478997


2

จากทั้งหมดที่กล่าวมา Isometric เป็นเพียงตาราง 2d ที่ถูกตัดเพื่อให้ถือว่าเป็นรูปแบบ 2d tilemap และคิดหาวิธีเข้ารหัสความลึก คุณจะทำเช่นนั้นในเกม 2d ปกติ (สามารถไปด้านหลังหรือข้างหน้าบล็อกเมื่อ 'กระโดด' ได้หรือไม่คุณจะเก็บความลึกต่อแผ่น (ความลึกบัฟเฟอร์ -> บัฟเฟอร์ z) หรือคุณจะใช้หลายเลเยอร์ หรือถ้าคุณต้องการนักเล่นคุณจะต้องใช้การโทรกลับต่อ tiletype (หรือการทำแผนที่) และสามารถทำทุกอย่างที่คุณต้องการตรวจสอบความลึกตรวจสอบอุปกรณ์ตรวจสอบผู้เล่น warp ให้ผู้เล่นเลื่อนขึ้นอย่างช้าๆ


คำตอบที่ดี Kaj - นี่เป็นประเด็นสำคัญของเรื่องนี้ฉันประหลาดใจที่ไม่มีใครนำมันขึ้นมา นี่เป็นสิ่งที่สร้างความสับสนให้กับมือใหม่ในเรื่องฟิสิกส์เสมอ
วิศวกร

1

คุณอาจมีเลเยอร์การชนแยกต่างหากเหนือระดับของคุณซึ่งมองไม่เห็นและใช้เพื่อตรวจสอบการชนกัน .. คุณสามารถใช้เลเยอร์นี้หลายเลเยอร์ตราบใดที่คุณรู้ว่าเลเยอร์ผู้เล่นคนใดเป็น;)

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