何らかの表面タイプを確実に実装する必要があります。自分のキャラクターが壁や梯子に衝突したかどうかわからない場合、はしごを登ることができる場合、どのように管理しますか?単純にOOPを使用して、遺産を使用して型階層を管理できますが、列挙型を使用して実装された「カテゴリ」を使用することをお勧めします。
アイデアは次のとおりです。「Collisions」列挙には、カテゴリごとにフラグがあります。例えば:
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
};
}
このメソッドを使用すると、プレーヤーのジャストが管理する必要があるものと衝突したかどうかをテストできるため、エンジンはエンティティの「Collided」メソッドを呼び出すことができます。
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
}
}
このメソッドは、ビットごとのフラグとビットごとの「Or」演算子を使用して、カテゴリのバイナリ値に基づいて各グループが異なる値を持つようにします。この方法はうまく機能し、簡単にスケーラブルであるため、税関衝突グループを作成できます。ゲーム内の各エンティティ(プレイヤー、敵など)には、「フィルター」と呼ばれるビットがあります。これは、衝突する可能性があるものを判別するために使用されます。衝突コードは、ビットが一致し、それに応じて反応するかどうかを確認する必要があります。コードは次のようになります。
void PhysicEngine::OnCollision(...)
{
mPhysics.AddContact( body1, body1.GetFilter(), body2, body2.GetFilter() );
}