ในเกมแพลตฟอร์ม 2 มิติจะทำให้แน่ใจได้อย่างไรว่าผู้เล่นเคลื่อนที่อย่างราบรื่นบนพื้นที่ลาดเอียง?


18

ฉันกำลังพัฒนาเอ็นจิ้นฟิสิกส์สำหรับเกมแพลตฟอร์ม 2D ฉันใช้ทฤษฎีแกนแยกสำหรับการตรวจจับการชน พื้นผิวดินถูกสร้างขึ้นจากกล่อง bounded oriented โดยผู้เล่นเป็นกล่อง bounding bounded แกน (โดยเฉพาะฉันใช้อัลกอริทึมจากหนังสือ "การตรวจจับการชนกันแบบเรียลไทม์" ซึ่งทำการตรวจจับการชนกันของ OBB โดยใช้ SAT) ฉันใช้สัมประสิทธิ์การคืนค่าที่ค่อนข้างเล็ก (ใกล้กับศูนย์) ในการตอบสนองการชนเพื่อให้แน่ใจว่าวัตถุแบบไดนามิกไม่ได้เจาะสภาพแวดล้อม

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

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

ข้อเสนอแนะใด ๆ ที่จะได้รับการชื่นชมอย่างมาก.


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

คำตอบ:


14

แพลตฟอร์มและฟิสิกส์

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

สร้างฮัลล์

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

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

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

พื้นผิวลาด

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

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

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

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


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

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

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

@Kovsa: อีกครั้งข้อผิดพลาดเหล่านั้นจะหายไปเมื่อคุณกำจัดขอบที่ไม่ควรเป็นส่วนหนึ่งของการชนกันในตอนแรก โซ่ขอบเข้าด้วยกันเพื่อสร้างรูปร่างที่ต่อเนื่อง เมื่อออกแบบระดับของคุณฉันขอแนะนำให้คุณจับจุดยอดด้วยกันเพื่อที่คุณจะได้ไม่มีรอยแยกเล็ก ๆ ในพื้นผิว ไม่แตกต่างไปจากที่คุณออกแบบระดับในโปรแกรมแก้ไข 3D mesh
Sean Middleditch

อืม ... ฉันไม่คิดว่าฉันจะตาม ในแผนภาพของฉันถ้าฉันต่อขอบเข้าด้วยกันเพื่อสร้างรูปร่างที่ไม่ขาดตอนฉันจะได้รูปร่างที่ประกอบด้วยส่วนของเส้นสามส่วน: ด้านบนของกล่อง A, B และ C ใช่ไหม? แม้ว่ามันจะเป็นรูปทรงเดียว แต่ฉันก็ยังคงต้องทำการตรวจจับการชนกันแยกจากกันกับบรรทัด A จากนั้นเป็น B และจากนั้น C ใช่ไหม นอกจากว่าคุณหมายถึงอัลกอริทึมที่สามารถตรวจจับการชนกันระหว่างกล่องและรูปร่างที่รวมกันนี้ได้หรือไม่ ฉันสมมติว่ามันจะไม่ใช่ SAT ในตอนนั้นเนื่องจากชุดของขอบอาจเว้า?
Nick Kovac

5

ฉันคิดว่าปัญหาทั้งสองนี้สามารถแก้ไขได้ด้วยการรักษากล่องของคุณเพื่อการตอบสนองการชนเช่นถ้าพวกเขามีมุมโค้งมน (มีรัศมีคล้ายกับข้อผิดพลาดเชิงตัวเลขของคุณ) สิ่งนี้จะทำให้พื้นผิวการรวมที่มีประสิทธิภาพของมุมการประชุมระหว่าง A และ B และ B และ C ราบรื่นขึ้น

ดังนั้นหากผู้เล่นที่เลื่อนไปทางซ้ายกระทบมุมของ A การปะทะแบบปกติจะเป็นเส้นทแยงมุมแทนที่จะเป็นทางขวาอย่างหมดจดดังนั้นจึงทำให้การเคลื่อนไหวต่อเนื่องขึ้นและลง


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

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


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

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

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

Ledges: D'oh! ตกลงไม่ง่ายอย่างที่ฉันคิด
Kevin Reid

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