Sie sollten sicherlich eine Art Oberflächentyp implementieren. Denken Sie darüber nach, wie werden Sie es schaffen, wenn Sie eine Leiter hochklettern können, wenn Sie nicht wissen, ob Ihr Charakter gerade gegen eine Wand oder eine Leiter gestoßen ist? Sie könnten einfach OOP verwenden, um eine Typhierarchie mithilfe des Erbes zu verwalten. Ich empfehle jedoch, "Kategorien" zu verwenden, die mit einem Aufzählungstyp implementiert wurden:
Hier ist die Idee: Eine Aufzählung "Kollisionen" hat ein Flag für jede Kategorie. Beispielsweise:
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
};
}
Mit dieser Methode können Sie testen, ob der Spieler irgendetwas kollidiert hat, das Sie verwalten sollten, sodass Ihre Engine eine "Kollidierte" Methode der Entität aufrufen kann:
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
}
}
Die Methode verwendet bitweise Flags und den bitweisen "Oder" -Operator, um sicherzustellen, dass jede Gruppe basierend auf dem Binärwert der Kategorie einen anderen Wert hat. Diese Methode funktioniert einwandfrei und ist leicht skalierbar, sodass Sie Zollkollisionsgruppen erstellen können. Jede Entität (Spieler, Feind usw.) in Ihrem Spiel verfügt über einige Bits, die als "Filter" bezeichnet werden und die bestimmen, womit sie kollidieren kann. Ihr Kollisionscode sollte prüfen, ob die Bits übereinstimmen, und entsprechend reagieren, mit einem Code, der wie folgt aussehen könnte:
void PhysicEngine::OnCollision(...)
{
mPhysics.AddContact( body1, body1.GetFilter(), body2, body2.GetFilter() );
}