ฉันจะแสดง projectiles ในวิดีโอเกมได้อย่างไร


14

ฉันกำลังสร้างเกมยิงคงที่ที่เรียบง่ายคล้ายกับ"Galaga" ) เป็นส่วนหนึ่งของการนำเสนอที่ฉันทำ ฉันสงสัยว่าผู้คนจะใช้กลยุทธ์และโครงสร้างข้อมูลใดในการติดตามขีปนาวุธเช่นเลเซอร์ที่ยิงจากยานอวกาศ การใช้งานง่ายสุด ๆ ที่ฉันเคยใช้คือแสดงให้เห็นถึงกระสุนปืนแต่ละจุดและตรวจสอบการชนกับวัตถุทั้งหมดในฉาก

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


5
เกม FPS จำนวนมากสันนิษฐานว่ากระสุนเป็นแบบทันที แต่มีเกมที่คำนวณวิถีและเวลาในการเดินทาง
John McDonald

2
+1 นี่เป็นคำถามที่ดีมากและฉันก็ไม่ได้ จำกัด ให้เป็น 3 มิติด้วยเช่นกัน
ashes999

คำตอบ:


8

สำหรับรวดเร็วมากขีปนาวุธ (เช่นเลเซอร์หรือกระสุน), คุณสามารถใช้เป็นเรย์

รังสีมีจุดเริ่มต้นและจุดสิ้นสุด โครงสร้างข้อมูล (น้อยมาก) สำหรับรังสีคือ:

struct Ray
{
  Vector3f start, end ;
} ;

ดูเหมือนว่านี้:

ป้อนคำอธิบายรูปภาพที่นี่

(คุณสามารถแคชเวกเตอร์ทิศทางและความยาวได้ แต่ฉันใช้ defn ที่ง่ายมากด้านบน)

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

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

รังสีสามารถปะทะกับทรงกลม, aabbs, hulls นูนได้อย่างมีประสิทธิภาพตรวจสอบโครงการHullinatorของฉันสำหรับโปรแกรมที่กำลังทำงานอยู่จริง (CTRL + คลิกเพื่อดับไฟ)


1
รังสีทำงานได้ไม่ดีนักสำหรับขีปนาวุธหลายตัว ตัวอย่างเช่นกระสุนปืนใด ๆ ที่สามารถลอบได้เช่นเปลือกหอย รังสีนั้นยอดเยี่ยมสำหรับการยิงกระสุนตรง
MichaelHouse

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

7
ในทางเทคนิครังสีเป็นจุดเริ่มต้นและทิศทาง สามารถกำหนดได้ด้วยจุดเริ่มต้นและอีกจุดหนึ่ง แต่นี่ไม่ใช่ส่วนหนึ่งของคำนิยาม รังสีหมายถึงอนันต์และไม่มีจุดสิ้นสุด
Casey Kuball

1
คุณพูดถูกจริงๆสิ่งที่ฉันอธิบายไว้คือส่วนของเส้นตรงแต่คนส่วนใหญ่เรียกพวกเขาว่ารังสีเมื่อพูดถึงการตรวจจับการชนกัน
bobobobo

3

การใช้รังสีทำงานได้ดีสำหรับการยิงขีปนาวุธในทันทีเช่นกระสุน สำหรับโปรเจคที่มีความเร็วช้ากว่าเช่นประเภทที่คุณใช้สำหรับเกมสเปซของคุณมันก็สมเหตุสมผลที่จะเพียงแค่ติดตามตำแหน่งของพวกเขาในโลกของเกมเหมือนกับที่คุณทำเอนทิตีอื่น ๆ สิ่งที่ฉันมักจะทำคือมีคลาสพื้นฐานที่เรียกว่าเอนทิตีซึ่งมีคุณสมบัติของวัตถุเกมที่ยั่งยืนใด ๆ - ตำแหน่งการหมุนกล่องการชน ฯลฯ ผู้เล่นของฉันขับเคลื่อนและขีปนาวุธจากนั้นก็สืบทอดมัน super class Entity ไม่ใช่เอนทิตีแต่ละประเภท

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


2

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

ต้นไม้ไบนารีไม่ แต่มีข้อเสียที่ว่าพวกเขาเลวได้อย่างง่ายดายเมื่อวัตถุที่มีการเพิ่มลบและเปลี่ยนตำแหน่งของพวกเขาดังนั้นคุณจะต้องอัตโนมัติสมดุลมัน

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

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