ฉันควรเขียนเอนจินฟิสิกส์ของตัวเองเพราะการรวมเครือข่าย?


11

ฉันกำลังพัฒนานักยิงซอมบี้ระดับบนลงล่างเรียลไทม์ ฉันกำลังเขียนโค้ดนี้ใน Java โดยใช้ JBox2D เป็นเครื่องมือฟิสิกส์ของฉัน ฉันได้รับการเข้ารหัสเครือข่ายในสัปดาห์นี้และตอนนี้ฉันได้ถึงการประสานฟิสิกส์

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

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

เหตุผลในการเขียนเอนจินฟิสิกส์ของฉันเอง -

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

เหตุผลในการขยาย / แก้ไข JBox2D

  • การเขียนกลไกทางฟิสิกส์ของฉันเองนั้นเป็นงานที่มีความสำคัญซึ่งอาจยุ่งยาก
  • JBox2D มีชุมชนที่สนับสนุนอย่างกว้างขวางซึ่งสามารถช่วยฉันในการพัฒนา
  • JBox2D มีการปรับแต่งเฉพาะสำหรับสิ่งต่าง ๆ เช่นการตรวจจับการชนกันของข้อมูลซึ่งทำให้มีประโยชน์
  • งานบางอย่างที่ทำไปแล้ว แต่มีการแชร์รหัสน้อย

ดังนั้นความคิดเห็นของคุณคืออะไร นี่เป็นเกมแรกของฉันและฉันไม่มีทางพัฒนาเกมมืออาชีพ หากใครก็ตามสามารถให้ลิงก์บางอันเพื่อทำงานที่ทำไปแล้วในพื้นที่ (โดยเฉพาะการใช้ JBox2D / Box2D / Java)


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

คำตอบ:


7

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

บัญชีสำหรับ 3 การชนกันที่อาจเกิดขึ้นได้ใน 2 รูปสี่เหลี่ยมผืนผ้า:

  1. Edge to edge: เรียบง่ายคุณจะได้แกนของขอบหนึ่งและอีกอันหนึ่งและคุณตัดสินใจว่าพวกมันครอบครองพื้นที่เดียวกันหรือใกล้พอ
  2. Edge to corner: สิ่งนี้จะเป็นเรื่องธรรมดาที่สุดหากคุณมีรูปร่างที่หมุน โชคดีที่มันค่อนข้างง่ายที่จะนำไปใช้
  3. จากมุมหนึ่งไปอีกมุมหนึ่ง: สิ่งนี้จะเกิดขึ้นน้อยมากจนไม่คุ้มที่จะนำไปใช้ เหตุผลก็คือว่าจะต้องมี 2 สิ่งที่ต้องเคลื่อนที่ไปในทิศทางตรงข้ามบนแกนที่แน่นอนเดียวกันกับทศนิยมที่คำนวณล่าสุดของคุณ ทีนี้ถ้าทุกอย่างหมุนไป 45 หรือ 90 องศา MAY นี้ (อาจจะยังไม่ถึง) ก็น่าจะคุ้มค่า

แก้ไข: ตามความเห็นฉันไม่ค่อยคุ้นเคยกับเรื่องนี้มากและไม่ควรปรึกษาเกี่ยวกับการชนกันระหว่างกระสุน / กระสุน

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

อ่านเกี่ยวกับการสร้างสิ่งนี้ตั้งแต่เริ่มต้นในความคิดเห็น


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

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

ตอนนี้อัปเดตข้อมูลในเอ็นจินให้สอดคล้องกับข้อมูลมากกว่าบนเซิร์ฟเวอร์สำหรับแต่ละ projectile projectile และส่งข้อมูลแพ็กเก็ตสำหรับสัญลักษณ์แสดงหัวข้อย่อยทุกรายการ (ลองนึกภาพการทำเช่นนั้นด้วยปืนกลเพียง 2 กระบอกบนหน้าจอ! Jesus!)


แน่นอนมันค่อนข้างง่ายต่อการใช้งาน แต่ฉันก็สนใจที่จะปรับการตรวจจับการชนกันของข้อมูลให้ดีขึ้นซึ่งฉันไม่รู้ว่าจะใช้งานอย่างไร
liamzebedee

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

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

ยกเว้นเมื่อฉันกำลังประมวลผลด้านเซิร์ฟเวอร์ชนซึ่งฉันจำเป็นต้องตรวจสอบการชนกันของผู้เล่นหลายคนและอื่น ๆ อีกมากมาย
liamzebedee

4
@MadPumpkin: ความมั่นใจของคุณสะท้อนถึงคำตอบของคุณไม่ดี คุณกำลังพูดถึงการตรวจจับการชน แต่คุณไม่ต้องพูดถึงการตรวจจับการชนแบบกวาดซึ่งเป็นหัวใจสำคัญของการจัดการกระสุนที่เหมาะสมในนักกีฬา 2D ยิ่งไปกว่านั้นแม้ว่าการกวาดความละเอียดจะมีความสำคัญเท่ากับการตรวจจับเนื่องจากคุณต้องตัดสินใจว่าการชนใดเกิดขึ้นก่อนแก้ไขข้อขัดแย้งที่อาจเกิดขึ้นและอาจเริ่มการแก้ไขทั้งหมดอีกครั้ง ไม่แน่นอนว่าเรื่องเล็กน้อยที่คุณดูเหมือนจะหมายถึงมันเป็น
sam hocevar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.