ฉันจะตรวจจับผู้เล่นที่ถูกบดขยี้ในแพลตฟอร์ม 2 มิติได้อย่างไร


19

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

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

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

# 3, 4 และ 5 นำเสนอสถานการณ์ที่เป็นปัญหา ใน # 3 ผู้เล่นกำลังเคลื่อนไปทางวัตถุซึ่งกำลังขยับขึ้น จุดปะทะด้านขวากำลังชนวัตถุทำให้เกิดการชนและหยุดเครื่องเล่น

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

สถานการณ์ที่คล้ายกันจะแสดงใน # 5 วัตถุสองชิ้นนั้นอยู่ห่างกันมากพอที่จุดปะทะด้านล่างจะชัดเจนช่วยให้ผู้เล่นตกลงมา แต่ไม่ถึงขนาดยอมให้จุดปะทะด้านข้างนั้นชัดเจนทำให้เกิดแนวนอนที่ไม่ต้องการ

ฉันคิดวิธีแก้ปัญหา แต่ก็ไม่มีอะไรที่ฉันคิดขึ้นมาทำงานได้ดีเป็นพิเศษดังนั้นฉันจึงสงสัยว่ามีใครมีความคิดหรือความเข้าใจในวิธีการแก้ปัญหาเหล่านี้หรือไม่

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

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

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

คำตอบ:


34

ฉันคิดว่าคุณจะต้องคำนึงถึงความเคลื่อนไหวของกล่องด้วย นั่นคือเพียงบดขยี้ถ้ากล่องจะเคลื่อนเข้าหาผู้เล่น

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

ดังนั้นบล็อกสามารถบดขยี้ผู้เล่นจากด้านบนเฉพาะเมื่อบล็อกกำลังเคลื่อนลง จากด้านล่างเฉพาะเมื่อบล็อกกำลังเลื่อนขึ้น จากด้านซ้ายเฉพาะในกรณีที่บล็อกกำลังเคลื่อนไปทางขวาและอื่น ๆ


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

จะเกิดอะไรขึ้นเมื่อบล็อคไม่เคลื่อนที่? ตอนนี้ฉันรู้แล้วว่าฉันวางลูกศรลงบนบล็อคใน # 5 แต่นั่นก็หมายความว่าเป็นบล็อกนิ่งสองบล็อก
IanLarson

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

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

9

ให้คะแนน "ทดสอบความสนใจ" อยู่ในกล่องสีเทาที่แสดงในรูปภาพ # 1 - นั่นคือฆ่าผู้เล่นเฉพาะในกรณีที่คุณตรวจพบการชนของหนึ่งในพิกเซลที่นั่น


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

6

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

โดยที่ในใจความคิดของการมีจุดแยกต่างหากสำหรับการชนในแนวนอนและแนวตั้งก็ไม่ได้บิน ดังนั้นกรณีที่ 3 และ 5 ของคุณจึงไม่มีอยู่

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

คั้นที่ขยับขึ้นด้านบนจะเพิ่มความซับซ้อนเป็นพิเศษ หากมันเร็วจนผู้เล่นไม่มีโอกาสหลบหนีได้ แต่ถ้ามันช้าลงผู้เล่นจะคาดหวังว่าจะสามารถวิ่งข้ามแพลตฟอร์มที่สูงขึ้นและกระโดดออกจากอีกด้านหนึ่งได้ ผู้เล่นผีเพิ่มขึ้นขึ้นไปบนบด, และการตรวจสอบรอยย่นที่เกิดขึ้นที่เพดาน


3
จุดเล็กน้อย - คุณไม่รู้ว่าผีสางของเขาเป็นอย่างไร สำหรับทั้งหมดที่เรารู้ว่ามันอาจจะตรงตามที่แสดงในภาพด้านบนดังนั้นกรณีที่ 3 และ 5 อาจถูกต้องทั้งหมด
อเล็กซ์

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

0

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

สิ่งนี้ถือว่าผู้เล่นไม่สามารถผลัก "เข้าสู่" วัตถุหรือพื้นดิน


0

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

BTW หากการรวมกันของรูปร่างที่ จำกัด สามารถชนกันได้อาจเป็นประโยชน์ในการคำนวณบิตแมป "การตรวจสอบการชนกัน" ล่วงหน้าเช่นถ้าพิกเซลถูกตั้งค่าในสไปรต์แรกที่ออฟเซ็ต (x1, y1) และในวินาที ที่ offset (x2, y2) ของวินาทีพิกเซลที่ offset (x1-x2, y1-y2) จะถูกตั้งค่าในแผนที่การชนกัน แผนที่การชนกันของข้อมูลที่คำนวณล่วงหน้านั้นจะช่วยให้สามารถตรวจจับการชนระหว่างสองสไปรท์ได้โดยการตรวจสอบสถานะของพิกเซลเดียวในแผนที่การชนกัน


0

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


0

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

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

หากตัวละครนั้นเคลื่อนไหวและถูกบดขยี้ (ชนกับฝ่ายตรงข้ามของเฟรมที่เข้ามา) ให้ตรวจสอบอีกครั้งเพื่อหาจุดสนใจที่พิกัดเฟรมสุดท้าย / การทำซ้ำ:

  1. หากไม่ได้รับการยืนยันอีกครั้งนั่นเป็นเพราะการเคลื่อนไหวของตัวละครและตัวละครควรจะกลับไปที่เฟรมสุดท้าย / พิกัดการวนซ้ำเช่นเดียวกับการชน

  2. หากได้รับการยืนยันความสนใจเป็นครั้งที่สองแล้วดำเนินการต่อความสนใจ

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