游戏碰撞处理

bfo*_*ops 9 c++ collision-detection

The code given is for example purposes, not copypasta from my codebase

我正在使用Boost和SDL用C++编写一个原始的,跨平台的Snake游戏,我想知道实现冲突处理的最佳方法是什么(不是碰撞检测).到目前为止,我一直在使用单一调度的想法,带有难看的意大利面条代码,如下所示:

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

另外,我有一个"全局"碰撞处理程序,它处理碰撞中涉及的事情,它们独立于每个对象,例如:


void GameWorld::CollisionHandler(WorldObject& obj1, WorldObject& obj2)
{
    if(obj1.GetObjectType() == snake && obj2.GetObjectType() == snake)
        PlayDeathSound();
    ...
    ...
}
Run Code Online (Sandbox Code Playgroud)

避免像碰撞一样播放两次的声音.

我也考虑过双重调度,如下:


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();
    }
    ...
    ...
}
Run Code Online (Sandbox Code Playgroud)

有没有我缺少的策略?哪一个最好是最好的?他们似乎都涉及一些丑陋的代码,而单一和双重调度涉及多态性,我个人试图回避.

Gar*_*ees 5

碰撞处理是C++/Java风格的面向对象(单一调度)不够灵活的领域.碰撞的结果取决于两个碰撞对象的类型,因此您需要多个调度来处理它.(维基百科的多个调度文章中的激励示例是碰撞处理,这并非巧合!)

我认为然后调度到单个对象方法的全局冲突处理程序是C++中这种不足的最佳解决方法.