แน่นอนคุณควรใช้พื้นผิวบางประเภท ลองคิดดูสิคุณจะจัดการอย่างไรถ้าคุณปีนขึ้นบันไดได้ถ้าคุณไม่รู้ว่าตัวละครของคุณเพิ่งชนกำแพงหรือบันได? คุณสามารถใช้ OOP เพื่อจัดการลำดับชั้นของประเภทโดยใช้เฮอริเทจ แต่ฉันขอแนะนำให้คุณใช้ "หมวดหมู่" ที่ดำเนินการโดยใช้ประเภทที่ระบุ:
นี่คือแนวคิด: การระบุ "การชน" มีธงสำหรับแต่ละหมวดหมู่ ตัวอย่างเช่น:
namespace Collisions
{
enum Type
{
None = 0,
Floor = 1 << 0,
Ladder = 1 << 1,
Enemy = 1 << 2,
... // And whatever else you need.
// Then, you can construct named groups of flags.
Player = Floor | Ladder | Enemy
};
}
ด้วยวิธีนี้คุณจะสามารถทดสอบว่าผู้เล่นเพิ่งชนสิ่งใดก็ตามที่คุณควรจัดการเพื่อให้เอ็นจินของคุณสามารถเรียกวิธีการ "ชนกัน" ของเอนทิตีได้
void Player::Collided( Collisions::Type group )
{
if ( group & Collisions::Ladder )
{
// Manage Ladder Collision
}
if ( group & Collisions::Floor )
{
// Manage Floor Collision
}
if ( group & Collisions::Enemy )
{
// Manage Enemy Collision
}
}
วิธีการใช้การตั้งค่าสถานะบิตค่าบิตและตัวดำเนินการ "หรือ" บิตเพื่อให้แต่ละกลุ่มมีค่าแตกต่างกันขึ้นอยู่กับค่าไบนารีของประเภท วิธีนี้ใช้งานได้ดีและปรับขนาดได้อย่างง่ายดายเพื่อให้คุณสามารถสร้างกลุ่มการชนกันของศุลกากร แต่ละเอนทิตี (ผู้เล่น, ศัตรู, ฯลฯ ) ในเกมของคุณมีบางบิตที่เรียกว่า "ตัวกรอง" ซึ่งใช้เพื่อกำหนดสิ่งที่มันสามารถชนกันได้ รหัสการชนของคุณควรตรวจสอบเพื่อดูว่าบิตตรงกันและตอบสนองด้วยรหัสบางอย่างที่อาจมีลักษณะดังนี้:
void PhysicEngine::OnCollision(...)
{
mPhysics.AddContact( body1, body1.GetFilter(), body2, body2.GetFilter() );
}