c++ - 游戏碰撞处理

标签 c++ collision-detection

给出的代码仅供示例使用,并非从我的代码库中复制粘贴

我正在使用 Boost 和 SDL 用 C++ 编写一个原始的跨平台贪吃蛇游戏,我想知道实现碰撞处理(而不是碰撞检测)的最佳方法是什么。到目前为止,我一直在使用单一分派(dispatch)的想法,使用丑陋的意大利面条代码,如下所示:

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

此外,我还有一个“全局”碰撞处理程序,它处理碰撞中涉及的事情,这些事情独立于每个对象,例如:


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

避免诸如声音因碰撞而播放两次之类的事情。

我也考虑过双重调度,像这样:


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();
    }
    ...
    ...
}

我是否缺少任何策略?其中哪一个最终是最好的?它们似乎都涉及到一些丑陋的代码,而单分派(dispatch)和双分派(dispatch)的代码涉及多态性,我个人试图回避它。

最佳答案

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

我认为,然后分派(dispatch)给各个对象方法的全局碰撞处理程序是解决 C++ 中这一不足的最佳解决方法。

关于c++ - 游戏碰撞处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4360041/

相关文章:

swift - didBeginContact 函数未被调用

c++ - 在对象已经初始化后,如何使用赋值运算符覆盖 C++ 中的类对象?

c++ - 三元运算符作为 bool 值转换

c++ - 使用不带虚拟变量的 C++ 范围重复 n 次

c++ - Qt Quick + CMake + 自定义 QObject 导致对 `vtable' 的 undefined reference

C# 数学,碰撞检测,xna

c++ - 删除指向同一对象的所有指针

c# - 一维数组碰撞

javascript - HTML5 Canvas : Mouse and polygon collision detection

python - Pygame - 实体移动限制 - 碰撞检测