ฟิสิกส์ 2D platformer ดี [ปิด]


76

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

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

ตัวอย่างของสิ่งที่ฉันหมายถึง:

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

ฉันไม่ได้มองหา "เฮ้ทำแบบนี้" เห็นได้ชัดว่าสิ่งที่ถูกต้องคือขึ้นอยู่กับสิ่งที่ฉันต้องการในเกม แต่ฉันหวังว่าจะมีใครซักคนที่ผ่านความเป็นไปได้และพูดว่า "เทคนิคที่ดี A ใช้คุณสมบัติ X ได้ดีเทคนิค B ทำได้ดี แต่มันใช้งานไม่ได้กับ C" หรือมีตัวอย่างการทำงานที่เกิน "ถ้า (key = = space) character.impulse (0, 1) "

คำตอบ:



25

มันค่อนข้างยุ่งยากในการใช้พูด 'เหมือนมาริโอ' โดยใช้เครื่องมือทางฟิสิกส์จริง

ครั้งล่าสุดที่ฉันลองสิ่งนี้โดยใช้ Chipmunk ฉันสร้างแบบจำลองผู้เล่นเป็นวงกลม 2 วง - 'วงกาย' ที่ด้านบนของ 'ฟุตวงกลม'

'เท้าของวงกลม' มีความเสียดทานบ้างไม่ใช่แบบเด้งและค่อนข้างเล็ก 'ลำตัววงกลม' ใหญ่ขึ้นและไม่มีแรงเสียดทานเพื่อหลีกเลี่ยงการเกาะติดกับกำแพง / ทางลาดชัน

วัตถุถูก จำกัด ให้ไม่หมุน - มันแค่เลื่อนไปรอบ ๆ

หาก 'เท้า' สัมผัสอะไรบางอย่างหรืออยู่ในช่วงไม่กี่เฟรมที่ผ่านมา (เพื่ออนุญาตให้ล้มลงได้) ผู้เล่นจะถูกพิจารณาว่าอยู่บนพื้นดิน (อาจมีการตรวจสอบพื้นผิวตามปกติด้วย)

มันเป็นเวลานานแล้วที่ฉันดูโค้ด แต่พฤติกรรมนั้นเป็นไปตาม:

เมื่ออยู่บนพื้น:

  • ใช้ 'แรงโน้มถ่วงเพิ่มเติม' (แรงลงเพื่อช่วยในการวิ่งลงทางลาด)
  • ใช้แรงเสียดทานพื้นดิน (จำนวนมากขึ้นของการทำให้หมาด ๆ แนวนอน)
  • ใช้แรงเคลื่อนย้ายไปทางซ้าย / ขวาตามการควบคุม
  • (ลดแรงเคลื่อนย้ายด้านซ้าย / ขวาตามความเร็วการวิ่งสูงสุด)
  • หากกดกระโดดให้ใช้แรงกระตุ้นสูงขึ้น

เมื่ออยู่ในอากาศ:

  • ใช้ความต้านทานอากาศ (จำนวนเล็กน้อยแนวนอนทำให้หมาด ๆ )
  • ใช้แรงโน้มถ่วงปกติ (หรือลดลง)
  • ใช้แรงเคลื่อนย้ายไปทางซ้าย / ขวาหากคุณอนุญาตให้ควบคุมอากาศได้

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

สิ่งอื่น ๆ ที่ต้องระวังแม้ว่า ... 'ข้ามผ่าน' แพลตฟอร์มอาจทำได้ยากและเมื่อคุณเริ่มทำสิ่งสนุก ๆ (แพลตฟอร์มที่กำลังเคลื่อนที่การหมุนรอบโลก ฯลฯ ) คุณต้องระวัง ตรวจสอบให้แน่ใจว่าผู้เล่นไม่สามารถดักหรือบดขยี้โดยวัตถุที่เคลื่อนไหวได้


ฉันรู้ว่านี่เป็นคำตอบที่ค่อนข้างเก่า แต่ฉันมีคำถามบางอย่างเกี่ยวกับเรื่องนี้ 1) คุณจะแก้ปัญหาอย่างไร "ให้ความเร็วเท่ากันกับสิ่งที่ลาดชันบนภูมิประเทศ" 2) หากคุณใช้วงกลมเล็ก ๆ สำหรับเท้าและวงกลมที่ใหญ่กว่าสำหรับร่างกายผู้เล่นจะไม่ถูกแขวนบนขอบบ้างหรือไม่? ฉันสนใจ aproach ของคุณจริงๆ
Notbad

18

สุจริตฉันไม่คิดว่าการใช้เครื่องมือฟิสิกส์เป็นวิธีการที่เหมาะสมสำหรับบางสิ่งบางอย่างในโดเมนขนาดนั้นที่มีข้อกำหนดที่เข้มงวดมาก

แค่เขียนเองทั้งหมด คุณจะได้ผลลัพธ์ที่ดีขึ้นมากโดยการพูดว่า "ย้ายตัวละครขึ้น x หน่วยในรูปพาราโบลานี้เมื่อกดปุ่มกระโดดค้างไว้เพื่อความยาว y" โดยการใช้ปุ่มจับมัดเพื่อปรับแต่ง


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

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

10

ฉันเขียนบทความเกี่ยวกับการสร้างเกมแพลตฟอร์มโดยเริ่มจากการใช้เทคโนโลยีที่ทันสมัยและรวมถึงวิธีที่ฉันจัดการกับฟิสิกส์อย่างง่าย:

http://www.wildbunny.co.uk/blog/2011/12/14/how-to-make-a-2d-platform-game-part-2-collision-detection/

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

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

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

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

หวังว่าจะช่วย!

ไชโยพอล


6

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

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