คิดว่ากระสุนและศัตรูหรือผู้เล่นและพื้น หากวัตถุเหล่านี้มีปฏิกิริยาโต้ตอบจะมีรหัสการโต้ตอบอะไร
คิดว่ากระสุนและศัตรูหรือผู้เล่นและพื้น หากวัตถุเหล่านี้มีปฏิกิริยาโต้ตอบจะมีรหัสการโต้ตอบอะไร
คำตอบ:
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);
}
}
}
}
}
การวนซ้ำแบบนี้ค่อนข้างไม่มีประสิทธิภาพ แต่มีที่ว่างสำหรับการปรับปรุงโดยใช้การแบ่งเชิงพื้นที่เป็นจุดเริ่มต้นสำหรับวัตถุที่รับประกันว่าจะไกลเกินกว่าที่จะชนกัน
หลังจากตรวจสอบวัตถุสองชิ้นสำหรับการชนกันที่อาจเกิดขึ้น (เช่นวัตถุทั้งสองอยู่ใกล้พอที่จะชนกัน) วัตถุนั้นจะถูกส่งออกไปเพื่อทำการตรวจจับการชนกันที่แม่นยำยิ่งขึ้น
ลองนึกภาพคุณมีรูปหลายเหลี่ยมสองรูปแบบและขนาดแบบสุ่มที่อยู่ใกล้พอที่จะตัดกัน แต่ไม่ได้เกิดจากรูปทรงเรขาคณิต:
เมื่อใช้ขอบเขตทรงกลมวัตถุทั้งสองนี้จะสร้างผลบวกที่ผิดพลาดสำหรับการชนที่มีศักยภาพ นี่คือที่ที่คุณจะต้องทำการผ่านอย่างละเอียดมากขึ้นเพื่อตรวจสอบว่าวัตถุทั้งสองนั้นตัดกันจริงๆ
เมื่อคุณพบการชนจริงขั้นตอนการแก้ปัญหาการชนของคุณจะทำการดำเนินการที่เหมาะสมเพื่อแก้ไขวัตถุโดยใช้แรงหรือช่วงเวลาขึ้นอยู่กับความละเอียดและความต้องการของฟิสิกส์เกมของคุณ
ด้วยความคิดนี้คุณจึงสามารถสรุปกระบวนการทั้งหมดของการตรวจจับการชนและความละเอียดเพื่อให้วัตถุของคุณไม่จำเป็นต้องรู้อะไรเกี่ยวกับกันและกันหรือกระบวนการที่จำเป็นในการกำหนดและแก้ไขการชน สองคลาส / ผู้จัดการที่จัดการสิ่งนี้สำหรับคุณเพียงแค่ต้องรู้คุณสมบัติพื้นฐานของแต่ละวัตถุเพื่อทำการตรวจสอบที่รวดเร็วและสกปรกสำหรับการชนจากนั้นตรวจสอบอย่างละเอียดมากขึ้นหากจำเป็นต้องใช้
วิธีหนึ่งที่ Unreal Engine 3 จัดการ:
สัญลักษณ์แสดงหัวข้อย่อยได้รับข้อความการชนบอกว่ามันตีอะไรบางอย่างกับการโต้แย้งบอกว่ามันตี มันสามารถเรียก objectHit.takeDamage (ตัวเอง) จากนั้นเป้าหมายจะได้รับข้อความ TakeDamage พร้อมตัวชี้ไปยังสิ่งที่ตีและดำเนินการตามความเหมาะสม
ฉันชอบวิธีนี้เป็นการส่วนตัวเพราะมันหมายถึงกระสุนสามารถดำเนินการพิเศษได้ (เช่นการสร้างเอฟเฟกต์การระเบิดขึ้นอยู่กับประเภทของการโจมตี) และเป้าหมายสามารถดำเนินการพิเศษได้ขึ้นอยู่กับประเภทของกระสุน
อาจเป็นไปได้ว่ากระสุนรู้ว่ามันจะทำอะไรกับเป้าหมายและสามารถเรียกใช้ฟังก์ชั่นบนมันเช่น objectHit.freeze (ตัวเอง) จากนั้นเป้าหมายจะรู้ว่าได้รับสิ่งที่ค้างและสิ่งที่เป็น
แก้ไข: คำตอบนี้เป็นภาพรวมของวิธีการทำงานเนื่องจากคุณอาจไม่ได้ทำงานกับ UE3 :)
โจรทำสิ่งนี้ได้ดีมากใน Dark Engine ที่มีแหล่งข้อมูลและ Receptrons วัตถุอาจมีคุณสมบัติเหล่านี้ทั้งสองประเภทที่แตกต่างกัน ตัวอย่างเช่นลูกศรน้ำจะมีแหล่งที่มาสำหรับ WaterStim ในการติดต่อ การระเบิดจะมี AoE FireStim
เมื่อ Water Arrow พุ่งชนวัตถุวัตถุเป้าหมายจะค้นหา Receptrons เพื่อหาอะไรก็ตามที่กำลังมองหา WaterStim ด้วยค่าความเข้มที่เหมาะสม จากนั้นมันจะเรียกใช้งานคำสั่งอะไรก็ตามที่เกี่ยวข้องกับมัน (ในกรณีนี้ให้เปลี่ยนคบเพลิงการเผาไหม้เป็นคบเพลิงและปล่อยควันออกมา)
เนื่องจากมีการใช้เอ็นจิ้นเดียวกันใน SystemShock2 นี่คือวิธีจัดการความเสียหายประเภทต่าง ๆ กระสุนที่แตกต่างกันมีชุด Stims ที่แตกต่างกันและมอนสเตอร์ที่แตกต่างกันจะมี Receptrons สำหรับ Stim ประเภทต่างๆและสร้างความเสียหายเท่ากับ 1 *, 2 *, 1 / 2 ความเข้มขึ้นอยู่กับว่าประเภทกระสุนเป็น "super effective" หรือไม่
ดูเหมือนว่าระบบมีความยืดหยุ่นอย่างมากเนื่องจากคุณสามารถเพิ่มแหล่งที่มาและตัวรับไปยังวัตถุในเครื่องมือแก้ไขระดับ (เพื่อสร้างประตูเปิดหนึ่งครั้งซึ่งเปิดถ้าโดนไฟไหม้) ขณะที่คุณสามารถบอกผู้รับให้ "ส่งสคริปต์ ข้อความ "ถ้าวัตถุมีสคริปต์พิเศษที่เกี่ยวข้องกับมัน
สิ่งที่คุณไม่ต้องการทำคือการเข้ารหัสเมทริกซ์การทำงานแบบ nXn ของวัตถุที่เป็นไปได้ทั้งหมดที่ชนกับวัตถุที่เป็นไปได้ทั้งหมด! ด้วยการพูดคุยทั่วไปผ่านข้อความที่ได้มาตรฐานคุณทำให้กระบวนการง่ายขึ้น
ทางออกหนึ่งคือการเก็บภาชนะบรรจุกระสุนและผู้เล่นในชั้นเรียนแยกต่างหากจากนั้นมีฟังก์ชั่น main () ซึ่งช่วยให้กรอบห่วงรับผิดชอบการโต้ตอบ