Обработка конфликтов в игре

Приведенный код предназначен для примера, а не для копирования из моей кодовой базы

Я пишу примитивный кросс- платформенная игра Snake на C ++ с Boost и SDL, и мне интересно, как лучше всего реализовать обработку столкновений (а не обнаружение столкновений). До сих пор я использовал идею однократной отправки с уродливым кодом спагетти, например:

void Snake::CollisionHandler(const WorldObject& obj)
{
    // collided with self
    if(obj.GetObjectType() == snake)
        Die();
    ...
    ...
}

Кроме того, у меня есть «глобальный» обработчик столкновений,


void Snake::CollisionHandler(WorldObject& obj) const
{
    // invoke obj's collision handler with a const Snake& parameter
    obj.CollisionHandler(*this);
}
// collided with self
void Snake::CollisionHandler(const Snake& obj)
{
    Die();
}

Это также включает аналогичный глобальный обработчик столкновений, как указано выше.

Затем есть подход только , имеющий глобальный обработчик столкновений (который является функцией друга для всех игровых объектов), например:


void GameWorld::CollisionHandler(WorldObject& obj1, WorldObject& obj2)
{
    // snake collided with self
    if(obj1.GetObjectType() == snake && obj2.GetObjectType() == snake)
    {
        obj1.Die();
        obj2.Die();
        PlayDeathSound();
    }
    ...
    ...
}

Какие стратегии мне не хватает? Что из этого лучше всего? Кажется, что все они содержат какой-то уродливый код, а коды с однократной и двойной отправкой включают полиморфизм, от которого я лично стараюсь уклоняться.

9
задан bfops 5 December 2010 в 17:10
поделиться