หากวัตถุสองอย่างโต้ตอบกันจะมีรหัสการโต้ตอบอะไร


28

คิดว่ากระสุนและศัตรูหรือผู้เล่นและพื้น หากวัตถุเหล่านี้มีปฏิกิริยาโต้ตอบจะมีรหัสการโต้ตอบอะไร


2
มีปฏิสัมพันธ์ในทางใด? คุณหมายถึง collision detection หรือไม่ ถ้าเป็นเช่นนั้นเป็นไปได้มากว่าคุณจะใช้ทั้งคลาสการตรวจจับการชนกันและตัวจัดการการแก้ไขความขัดแย้ง
CaptainRedmuff

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

คำตอบ:


23

TL; DR:

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

สิ่งที่ดี

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

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

pseudocode:

dectectCollisions(objects)
{
    for(objectA in objects)
    {
        for(objectB in objects)
        {
            if(objectA != objectB) //ignore self
            {
                if(BoundingSpheresIntersect(objectA, objectB))
                {
                    collisionResolver.addObjects(objectA, objectB);
                }
            }
        }
    }
}

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

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

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

พบรูปภาพผ่าน google

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

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

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


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

12

วิธีหนึ่งที่ Unreal Engine 3 จัดการ:

สัญลักษณ์แสดงหัวข้อย่อยได้รับข้อความการชนบอกว่ามันตีอะไรบางอย่างกับการโต้แย้งบอกว่ามันตี มันสามารถเรียก objectHit.takeDamage (ตัวเอง) จากนั้นเป้าหมายจะได้รับข้อความ TakeDamage พร้อมตัวชี้ไปยังสิ่งที่ตีและดำเนินการตามความเหมาะสม

ฉันชอบวิธีนี้เป็นการส่วนตัวเพราะมันหมายถึงกระสุนสามารถดำเนินการพิเศษได้ (เช่นการสร้างเอฟเฟกต์การระเบิดขึ้นอยู่กับประเภทของการโจมตี) และเป้าหมายสามารถดำเนินการพิเศษได้ขึ้นอยู่กับประเภทของกระสุน

อาจเป็นไปได้ว่ากระสุนรู้ว่ามันจะทำอะไรกับเป้าหมายและสามารถเรียกใช้ฟังก์ชั่นบนมันเช่น objectHit.freeze (ตัวเอง) จากนั้นเป้าหมายจะรู้ว่าได้รับสิ่งที่ค้างและสิ่งที่เป็น

แก้ไข: คำตอบนี้เป็นภาพรวมของวิธีการทำงานเนื่องจากคุณอาจไม่ได้ทำงานกับ UE3 :)


10

โจรทำสิ่งนี้ได้ดีมากใน Dark Engine ที่มีแหล่งข้อมูลและ Receptrons วัตถุอาจมีคุณสมบัติเหล่านี้ทั้งสองประเภทที่แตกต่างกัน ตัวอย่างเช่นลูกศรน้ำจะมีแหล่งที่มาสำหรับ WaterStim ในการติดต่อ การระเบิดจะมี AoE FireStim

เมื่อ Water Arrow พุ่งชนวัตถุวัตถุเป้าหมายจะค้นหา Receptrons เพื่อหาอะไรก็ตามที่กำลังมองหา WaterStim ด้วยค่าความเข้มที่เหมาะสม จากนั้นมันจะเรียกใช้งานคำสั่งอะไรก็ตามที่เกี่ยวข้องกับมัน (ในกรณีนี้ให้เปลี่ยนคบเพลิงการเผาไหม้เป็นคบเพลิงและปล่อยควันออกมา)

เนื่องจากมีการใช้เอ็นจิ้นเดียวกันใน SystemShock2 นี่คือวิธีจัดการความเสียหายประเภทต่าง ๆ กระสุนที่แตกต่างกันมีชุด Stims ที่แตกต่างกันและมอนสเตอร์ที่แตกต่างกันจะมี Receptrons สำหรับ Stim ประเภทต่างๆและสร้างความเสียหายเท่ากับ 1 *, 2 *, 1 / 2 ความเข้มขึ้นอยู่กับว่าประเภทกระสุนเป็น "super effective" หรือไม่

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

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


จากมุมมองของสคริปต์วิธีนี้ดูเหมือนจะยืดหยุ่นและแสดงออกได้มากที่สุด เด็ดมาก
drhayes

-2

ทางออกหนึ่งคือการเก็บภาชนะบรรจุกระสุนและผู้เล่นในชั้นเรียนแยกต่างหากจากนั้นมีฟังก์ชั่น main () ซึ่งช่วยให้กรอบห่วงรับผิดชอบการโต้ตอบ

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