Вам неодмінно слід реалізувати якийсь тип поверхні. Подумайте, як вам вдасться, якщо зможете піднятися по сходах, якщо ви не можете знати, чи ваш персонаж просто зіткнувся зі стіною чи драбиною? Ви можете просто використовувати OOP для управління ієрархією типів за допомогою спадщини, але я б запропонував вам використовувати "категорії", реалізовані за допомогою переліченого типу:
Ось ідея: Перелік "Зіткнень" містить прапор для кожної категорії. Наприклад:
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
};
}
За допомогою цього методу ви зможете перевірити, чи гравець juste зіткнувся з чим-небудь, чим вам слід керувати, щоб ваш двигун міг викликати метод "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
}
}
Метод використовує побітові прапори та оператор порозрядного повороту "Або", щоб переконатися, що для кожної групи є різне значення, виходячи з бінарного значення категорії. Цей метод працює чудово і легко масштабується, щоб ви могли створити групи митних зіткнень. Кожна особа (Player, Enemy тощо) у вашій грі має кілька бітів, які називаються "фільтром", які використовуються для визначення того, з чим вона може зіткнутися. Код зіткнення повинен перевірити, чи збігаються біти і відповідно реагувати на них, який код може виглядати так:
void PhysicEngine::OnCollision(...)
{
mPhysics.AddContact( body1, body1.GetFilter(), body2, body2.GetFilter() );
}