Architecture 识别哪些特定游戏对象发生碰撞的好方法是什么?

Architecture 识别哪些特定游戏对象发生碰撞的好方法是什么?,architecture,software-design,multiple-dispatch,dynamic-dispatch,Architecture,Software Design,Multiple Dispatch,Dynamic Dispatch,这是关于物理引擎的。一旦发生碰撞,它会返回两个游戏对象发生碰撞的信息。所有实体,如玩家、怪物、子弹等都是从GameObject派生(继承)的 识别哪些特定游戏对象发生碰撞的好方法是什么 枚举:我曾考虑过使用枚举,但一旦开始添加更多实体,就无法跟踪所有可能的组合 编辑:我在这里找到了C#的潜在解决方案: 但是,如果我必须在C++中这样做,我会怎么做?< p>典型的解决方案是执行两个级别的调度: class Thing { public abstract void Collide(Thing

这是关于物理引擎的。一旦发生碰撞,它会返回两个游戏对象发生碰撞的信息。所有实体,如玩家、怪物、子弹等都是从GameObject派生(继承)的

识别哪些特定游戏对象发生碰撞的好方法是什么

枚举:我曾考虑过使用枚举,但一旦开始添加更多实体,就无法跟踪所有可能的组合

编辑:我在这里找到了C#的潜在解决方案:


<>但是,如果我必须在C++中这样做,我会怎么做?

< p>典型的解决方案是执行两个级别的调度:
class Thing
{
    public abstract void Collide(Thing other);
    public abstract void CollideWithSpaceship(Spaceship spaceship);
    public abstract void CollideWithAsteroid(Asteroid asteroid);
};

class Spaceship : Thing
{
    public override void Collide(Thing other) {
        other.CollideWithSpaceship(this);
    }

    public abstract void CollideWithSpaceship(Spaceship spaceship)
    {
        // Handle Spaceship -> Spaceship collision...
    }

    public abstract void CollideWithAsteroid(Asteroid asteroid)
    {
        // Handle Spaceship -> Asteroid collision...
    }
}

class Asteroid : Thing
{
    public override void Collide(Thing other) {
        other.CollideWithAsteroid(this);
    }

    public abstract void CollideWithSpaceship(Spaceship spaceship)
    {
        // Handle Asteroid -> Spaceship collision...
    }

    public abstract void CollideWithAsteroid(Asteroid asteroid)
    {
        // Handle Asteroid -> Asteroid collision...
    }
}
随着不同类数量的增加,它变得有点麻烦,但它有一些优势:

  • 很快。它依赖于语言内置的动态调度,即 优化得很好
  • 这是打字安全的。你会注意到没有演员在演
  • 缺点是:

  • 它不是无限延伸的。添加新类需要您触摸 所有其他的
  • 一个更可扩展的解决方案是构建一个2D调度表,其中每个单元标识一对冲突的类。在每个单元格中,放置一个处理这两个类类型之间冲突的函数。这也很好,但它有点欺骗了类型系统。最后,您将进行一些铸造,并且您必须想出一种识别类的好方法

    我不会使用C#的
    动态
    支持。我强烈的预感是,对于物理引擎来说,速度太慢了


    我还要指出,有一种方法能更好地回答这样的问题。再见Thing
    )。在其他访问者实现中,情况并非总是如此。如果您对多方法感兴趣,请看一下CLOS,Common Lisp中的对象系统。这是最著名的多方法语言。