Z pewnością powinieneś wdrożyć jakiś rodzaj powierzchni. Pomyśl o tym, jak sobie poradzisz, jeśli będziesz mógł wspiąć się po drabinie, jeśli nie wiesz, czy twoja postać po prostu zderzyła się ze ścianą lub drabiną? Możesz po prostu użyć OOP do zarządzania hierarchią typów przy użyciu dziedzictwa, ale sugerowałbym użycie „kategorii” zaimplementowanych przy użyciu typu wyliczonego:
Oto pomysł: Wyliczenie „Kolizje” ma flagę dla każdej kategorii. Na przykład:
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
};
}
Dzięki tej metodzie będziesz mógł sprawdzić, czy gracz po prostu zderzył się z czymś, czym powinieneś zarządzać, aby twój silnik mógł nazwać metodę „zderzoną” encji:
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
}
}
Metoda wykorzystuje flagi bitowe i bitowy operator „Lub”, aby upewnić się, że każda grupa ma inną wartość na podstawie wartości binarnej kategorii. Ta metoda działa dobrze i jest łatwo skalowalna, dzięki czemu można tworzyć celne grupy kolizyjne. Każda jednostka (gracz, wróg itp.) W twojej grze ma pewne bity zwane „filtrem”, które służą do ustalenia, z czym może się zderzyć. Twój kod kolizyjny powinien sprawdzić, czy bity są zgodne i odpowiednio zareagować, z pewnym kodem, który może wyglądać następująco:
void PhysicEngine::OnCollision(...)
{
mPhysics.AddContact( body1, body1.GetFilter(), body2, body2.GetFilter() );
}