วิธีการสร้างการตรวจจับการชนเกม 2D สมจริง


9

ฉันอยากจะสร้างเกมสวมบทบาท 2D สมัยเก่าเช่น Star Ocean, Final Fantasy, Sword of Mana และแม้กระทั่งซีรีส์เรื่อง "Tales of" และฉันคิดว่าผู้คนจำนวนมากทำ แต่ก่อนที่ฉันจะเขียนรหัสบรรทัดเดียวฉันได้ทำการค้นคว้ามากมายวาดและทดลอง

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

ฉันรู้วิธีการคำนวณการตรวจจับการชนกันหลายวิธีแล้วให้ดูตัวอย่างต่อไปนี้:

ตัวอย่างการตรวจจับการชนกันของข้อมูล

สิ่งเหล่านี้ไม่ตรงกับความต้องการของฉัน

  • การชนแบบเรียงต่อกันนั้นง่ายเกินไปและเหมาะสมกับเซลด้ามากกว่าสตาร์โอเชียน นอกจากนี้การวาดภาพของแต่ละกระเบื้องต้องเติมเต็มพื้นที่ทั้งหมดเพื่อให้ดูสมจริง
  • Pixel-perfect มีข้อ จำกัด มากเกินไป หากไทล์ของคุณมีพิกเซลอยู่ที่นี่และที่นั่นผู้เล่นมักจะติดอยู่ที่กลางคัน (เช่น: ในบางเกมที่คุณติดอยู่ที่รากต้นไม้กว้าง 2 พิกเซล)
  • และมาสก์ไบนารีจะใช้หน่วยความจำและการตั้งค่ามากเกินไป

ฉันอ่านเอกสารจำนวนมาก แต่ฉันไม่เคยพบสิ่งที่ดูดีสำหรับฉันเลย และการทดลองทั้งหมดของฉันไม่ได้ดูใกล้เคียงกับสิ่งที่ฉันเคยเล่นด้วย ดังนั้นหากคุณมีลิงค์หรือแบบฝึกหัดที่ดีเกี่ยวกับการทำงานของเกม RPG แบบสองมิติที่มีวิวัฒนาการ


2
คุณกำลังพัฒนาสภาพแวดล้อมใดสำหรับมาสก์การปะทะนั้นใช้หน่วยความจำมากเกินไป นั่นไม่ใช่ข้อกังวลสำหรับระบบที่ทันสมัยส่วนใหญ่และรูปแบบการชนกันของเสียงจะดูเหมือนกับสิ่งที่คุณกำลังมองหา
Gregory Avery-Weir

ฉันพัฒนาบนพีซีส่วนใหญ่ด้วย XNA แต่เมื่อเร็ว ๆ นี้ฉันคิดที่จะเริ่มโครงการบน WP7 ปัญหาที่ฉันมีกับมาสก์การชนคือการใช้ความละเอียดขนาดเล็กที่มันทำหน้าที่เหมือนกับพิกเซลที่สมบูรณ์แบบที่จะทำโดยทำให้ตัวละครของฉันติดอยู่ตรงมุม ดังนั้นหากคุณไม่ได้ใช้Bézier curve สำหรับการเคลื่อนไหวที่ราบรื่นคุณจะต้องระมัดระวังอย่างมากในการสร้างมาสก์
Aymeric

คำตอบ:


9

บทเรียน Nอาจช่วยได้ที่นี่ เป็นที่ยอมรับว่าพวกเขามีไว้สำหรับ platformer สไตล์อาร์เคด แต่พวกเขาจะทำงานเช่นเดียวกับ RPG มุมมองจากบนลงล่าง อย่าใช้แรงโน้มถ่วง สถานที่ตั้งคือการทดสอบการชนกันในคอลเลกชันของรูปทรงพื้นฐาน - วงกลม, กล่องที่มีการจัดแนวแกน, เส้น, จุด, และอื่น ๆ

จากนั้นคุณก็ตกแต่งโลกของคุณด้วยสิ่งเหล่านี้ (อาจจะผ่านเครื่องมือแก้ไขระดับที่กำหนดเอง) หรือสร้างพวกเขาโดยอัตโนมัติ (พอดีกับกล่องหรือวงกลมที่ใกล้ที่สุด) - หรือทั้งสองอย่าง (เริ่มต้นกับกล่อง / วงกลมที่สร้างโดยอัตโนมัติ .

ที่ฉันทำงานอยู่เราได้ทำ platformers ค่อนข้างน้อยและเกมสำรวจบนลงล่างบางอย่าง เราทำมาตั้งแต่สมัย GBA เรามักใช้ AABB สำหรับตัวละครและวัตถุที่ปรับได้ในตัวแก้ไขสไปรต์ - และเราคลั่งไคล้ที่นี่โดยอนุญาตให้มีกล่องหนึ่งกล่องต่อสไปรต์บางอันมีจุดประสงค์ที่แตกต่างกัน เราอาจมี:

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

ระดับส่วนใหญ่เป็นสตริงของส่วนของเส้นตรง เรามีข้อมูลเมตาต่อเซ็กเมนต์เพื่ออธิบายความเสียหายหรือพื้นผิวลื่น ฯลฯ

ดังนั้นการตรวจจับการชนและการตอบสนองส่วนใหญ่จึงกลายเป็น AABB-vs-AABB หรือ AABB-vs-Segment บางครั้งเราโยนเป็นวงกลม - บางสิ่งบางอย่างสำหรับกระสุนปืนแม้ว่า AABB มักจะทำที่นี่เช่นกัน

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


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

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