Приведенный код предназначен для примера, а не для копирования из моей кодовой базы
Я пишу примитивный кросс- платформенная игра 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();
}
...
...
}
Какие стратегии мне не хватает? Что из этого лучше всего? Кажется, что все они содержат какой-то уродливый код, а коды с однократной и двойной отправкой включают полиморфизм, от которого я лично стараюсь уклоняться.