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

时间:2011-01-30 00:57:18

标签: architecture software-design multiple-dispatch dynamic-dispatch

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

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

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

编辑:我在这里找到了一个针对C#的潜在解决方案:http://blogs.msdn.com/b/laurionb/archive/2009/08/13/multimethods-in-c-4-0-with-dynamic.aspx

但是,如果我必须在C ++中这样做,我该怎么做呢?

1 个答案:

答案 0 :(得分:1)

典型的解决方案是执行两个级别的调度:

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...
    }
}

随着不同课程数量的增加,这有点麻烦,但它有一些事情要做:

  1. 这很快。它依赖于语言内置的动态调度 很好地优化了。
  2. 这是类型安全的。你会注意到没有施法。
  3. 缺点是:

    1. 扩展不是开放式的。添加新课程需要您触摸 所有其他人。
    2. 更具扩展性的解决方案是构建一个2D调度表,其中每个单元格标识一对碰撞类。在每个单元格中,您放置一个处理这两个类类型之间冲突的函数。这也很有效,但它会欺骗类型系统。你最终会做一些演员,你必须想出一个识别课程的好方法。

      使用C#的dynamic支持。我强烈的预感是它对物理引擎来说太慢了。

      我还要指出,有一个Game Development Stack Exchange可以更好地回答这样的问题。在那里见!