반드시 어떤 종류의 표면 유형을 구현해야합니다. 생각해보십시오. 캐릭터가 벽이나 사다리와 충돌했는지 알 수없는 경우 사다리를 올라갈 수 있다면 어떻게 관리 할 것입니까? 단순히 OOP를 사용하여 Heritage를 사용하여 유형 계층을 관리 할 수 있지만 열거 된 유형을 사용하여 구현 된 "범주"를 사용하는 것이 좋습니다.
아이디어는 다음과 같습니다. "충돌"열거에는 각 범주에 대한 플래그가 있습니다. 예를 들면 다음과 같습니다.
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
};
}
이 방법을 사용하면 플레이어가 관리해야 할 항목을 충돌했는지 테스트하여 엔진이 엔티티의 "복합"메소드를 호출 할 수 있습니다.
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
}
}
이 방법은 비트 단위 플래그와 비트 단위 "Or"연산자를 사용하여 범주의 이진 값에 따라 각 그룹의 값이 달라 지도록합니다. 이 방법은 잘 작동하고 쉽게 확장 가능하므로 세관 충돌 그룹을 만들 수 있습니다. 게임의 각 엔티티 (플레이어, 적 등)에는 충돌 할 수있는 것을 결정하는 데 사용되는 "필터"라는 비트가 있습니다. 충돌 코드는 다음과 같은 코드를 사용하여 비트가 일치하고 반응하는지 확인해야합니다.
void PhysicEngine::OnCollision(...)
{
mPhysics.AddContact( body1, body1.GetFilter(), body2, body2.GetFilter() );
}