Seguramente debería implementar algún tipo de tipo de superficie. Piénselo, ¿cómo se las arreglará si puede subir una escalera si no puede saber si su personaje simplemente chocó una pared o una escalera? Simplemente puede usar OOP para administrar una jerarquía de tipos usando herencia, pero le sugiero que use "categorías" implementadas usando un tipo enumerado:
Aquí está la idea: una enumeración de "Colisiones" tiene una bandera para cada categoría. Por ejemplo:
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
};
}
Con este método, podrá probar si el jugador colisionó con algo que debería manejar, por lo que su motor puede llamar un método "colisionado" de la entidad:
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
}
}
El método utiliza indicadores a nivel de bits y el operador "O" a nivel de bits para garantizar que cada grupo tenga un valor diferente, en función del valor binario de la categoría. Este método funciona bien y es fácilmente escalable para que pueda crear grupos de colisión personalizados. Cada entidad (jugador, enemigo, etc.) en su juego tiene algunos bits llamados "filtro", que se utilizan para determinar con qué puede colisionar. Su código de colisión debe verificar para ver si los bits coinciden y reaccionar en consecuencia, con algún código que podría verse así:
void PhysicEngine::OnCollision(...)
{
mPhysics.AddContact( body1, body1.GetFilter(), body2, body2.GetFilter() );
}