Вы обязательно должны реализовать какой-то тип поверхности. Подумайте об этом, как вы справитесь, если сможете подняться по лестнице, если не знаете, столкнулся ли ваш персонаж со стеной или лестницей? Вы можете просто использовать ООП для управления иерархией типов, используя наследие, но я бы предложил вам использовать «категории», реализованные с использованием перечислимого типа:
Вот идея: перечисление «Столкновения» имеет флаг для каждой категории. Например:
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
}
}
В этом методе используются побитовые флаги и побитовый оператор «ИЛИ», чтобы гарантировать, что каждая группа имеет различное значение в зависимости от двоичного значения категории. Этот метод отлично работает и легко масштабируется, поэтому вы можете создавать таможенные коллизионные группы. Каждый объект (игрок, враг и т. Д.) В вашей игре имеет несколько битов, называемых «фильтром», которые используются для определения того, с чем он может столкнуться. Ваш код столкновения должен проверить, соответствуют ли биты и реагируют ли они соответствующим образом, с некоторым кодом, который может выглядеть так:
void PhysicEngine::OnCollision(...)
{
mPhysics.AddContact( body1, body1.GetFilter(), body2, body2.GetFilter() );
}