Kesinlikle bir tür yüzey tipi uygulamalısınız. Bir düşünün, karakterinizin bir duvara mı yoksa bir merdiveni çarpıp çarpmadığını bilmiyorsanız bir merdivene tırmanıp tırmanamayacağınızı nasıl başaracaksınız? Sadece miras kullanarak bir tür hiyerarşisini yönetmek için OOP kullanabilirsiniz, ancak numaralandırılmış bir tür kullanılarak uygulanan "kategoriler" kullanmanızı öneririz:
İşte fikir: Bir "Çarpışma" numaralandırmasının her kategori için bir bayrağı vardır. Örneğin:
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
};
}
Bu yöntemle, oyuncunun juste'ın yönetmeniz gereken herhangi bir şeyi çarpıştırıp çarpmadığını test edebileceksiniz, böylece motorunuz varlığın "Çarpışma" Yöntemi'ni çağırabilir:
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
}
}
Yöntem, her bir grubun kategorinin ikili değerine göre farklı bir değere sahip olmasını sağlamak için bitsel bayraklar ve bitsel "Or" operatörünü kullanır. Bu yöntem iyi çalışır ve kolayca ölçeklenebilir, böylece gümrük çarpışma grupları oluşturabilirsiniz. Oyununuzdaki her Varlığın (Oyuncu, Düşman vb.) "Filtre" adı verilen bazı bitleri vardır ve bunlar neyle çarpışabileceğini belirlemek için kullanılır. Çarpışma kodunuz, bitlerin buna uygun olarak eşleşip tepki vermediğini kontrol etmelidir;
void PhysicEngine::OnCollision(...)
{
mPhysics.AddContact( body1, body1.GetFilter(), body2, body2.GetFilter() );
}