ฉันจะจัดการการตรวจจับการชนกันของวัตถุได้อย่างไรเพื่อไม่ให้วัตถุที่รวดเร็วผ่านผนัง


14

ฉันกำลังสร้างนักแม่นปืน 2d และฉันมีปัญหาเล็กน้อยกับการตรวจจับการชนกันของกระสุน ทุกอย่างรวมถึงสัญลักษณ์แสดงหัวข้อย่อยเป็นวัตถุที่มีวิธีการหลายเหลี่ยม / ปรับปรุงของตัวเอง

ปัญหาคือกระสุนปืนไปอย่างรวดเร็วและที่ 60 เฟรมต่อวินาที (เกมทำงานที่) กระสุนมักจะข้ามผ่านกำแพง - เนื่องจากมันเคลื่อนที่มากกว่าความกว้างของกำแพงในช่วงเวลาการอัพเดท - และ ดำเนินต่อไปอย่างมีความสุขในทางเนื่องจากรูปหลายเหลี่ยมจะไม่ทับซ้อนกันจริง

ฉันจะทำอะไรเกี่ยวกับเรื่องนี้? สิ่งเดียวที่ฉันทำได้คือการลากเส้นจากตำแหน่งเดิมไปยังตำแหน่งใหม่และทำการตรวจจับการชนกันของข้อมูลนั้น ฉันจะแก้ปัญหานี้ได้อย่างไร


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

คำตอบ:


9

แนวทางมาตรฐานคือ (เลือกหนึ่งข้อ):

  1. เพิ่มขอบเขตความกว้างของคุณและ / หรือลดความเร็วสูงสุดของสัญลักษณ์แสดงหัวข้อย่อยของคุณเพื่อที่จะไม่สามารถข้ามกำแพงในการปรับปรุงครั้งเดียว
  2. ดำเนินการตรวจจับการชนกันอย่างต่อเนื่อง (CCD) โดยปกติโดยการใช้รังสีเพื่อตรวจจับการชนกับพื้นผิวแบบเชิงเส้น (2) หรือระนาบ (3D) หน้าวัตถุเคลื่อนที่ นี่คือราคาแพงกว่า แต่เป็นวิธีแก้ปัญหาที่โค้งมนมากขึ้น การฉายซ้ำกับเส้น 2D นั้นค่อนข้างธรรมดา แต่คุณจำเป็นต้องกำหนดขอบเขตทั้งหมดของคุณให้เป็นรูปหลายเหลี่ยมแบบเส้นตรงในกรณีนี้

สำหรับเรื่องที่คุณสามารถจำลองกระสุนของคุณเป็นรังสีแทน - ถ้าพอดีกับรูปลักษณ์และความรู้สึกของเกมของคุณในขณะที่left4kdead ด้วยวิธีนี้คุณไม่จำเป็นต้องประมาณกระสุนเป็นรังสีเพราะมันมีรังสีอยู่แล้ว จากมุมมองของลุคสิ่งนี้ดูดีถ้าคุณวาดเส้นด้วยจุดที่สว่างขึ้นที่ส่วนท้ายของสัญลักษณ์แสดงหัวข้อย่อยหรือเพียงแค่ลากเส้นเป็นเส้นไล่ระดับจากแสง (สัญลักษณ์แสดงหัวข้อย่อย) ไปยังความมืด (ส่วนท้ายหาง) การเคลื่อนไหว

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


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

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

ใช่ฉันคิดว่าฉันสามารถใช้เส้นตรงเป็นสัญลักษณ์แสดงหัวข้อย่อยและอาจหาวิธีที่จะทำให้พวกเขาโค้งลงเล็กน้อยในภายหลังถ้ามันดูเหมือนสำคัญ
Mala

2
หากความเร็วของกระสุนไม่สูงเกินไป (เช่นไม่เร็วจนคุณไม่สามารถมองเห็นพวกมันเคลื่อนที่ผ่านหน้าจอได้) จากนั้นคุณสามารถใช้แรงโน้มถ่วงกับความเร็วขณะที่ยังคงจำลองการตรวจจับการชนโดยใช้รังสีแบบง่าย ผู้ใช้จะไม่สังเกตเห็นว่ากระสุนกำลังเคลื่อนที่เป็นชุดของเส้นตรงอีกต่อไปกว่าที่เขาจะสังเกตเห็นว่าวัตถุอื่น ๆ ทั้งหมดของคุณทำเช่นเดียวกัน สำหรับสัญลักษณ์แสดงหัวข้อย่อยการคำนวณและการวาดเส้นโค้ง (เส้นโค้ง) ไม่ยากและจะเพิ่มภาพลวงตาของเส้นโค้งเรียบไปยังวิถีกระสุนของ
Sean Middleditch

3

หากคุณต้องการให้สัญลักษณ์แสดงหัวข้อย่อยของคุณมีลักษณะเหมือนวัตถุทางกายภาพ (เช่นสัญลักษณ์แสดงหัวข้อย่อยของคุณเป็นเหมือนลูกศรหรือก้อนหินจากหนังสติ๊กมากกว่าปืนยิง) คุณสามารถลองเพิ่มความถี่ของการอัพเดทฟิสิกส์ของคุณได้

ดังนั้นในขณะที่เกมของคุณอาจทำงานด้วย 60 เฟรมต่อวินาทีการจำลองแบบฟิสิกส์ของคุณสามารถรันได้ที่ 120 การปรับปรุงต่อวินาที (นี่คือการแก้ไขปัญหาการประทับเวลาของคุณโดยทั่วไปซึ่งอธิบายการตั้งค่าทางฟิสิกส์ที่ดีที่สามารถวิ่งด้วยความเร็วที่แตกต่างกัน

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


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