Architecture 识别哪些特定游戏对象发生碰撞的好方法是什么?
这是关于物理引擎的。一旦发生碰撞,它会返回两个游戏对象发生碰撞的信息。所有实体,如玩家、怪物、子弹等都是从GameObject派生(继承)的 识别哪些特定游戏对象发生碰撞的好方法是什么 枚举:我曾考虑过使用枚举,但一旦开始添加更多实体,就无法跟踪所有可能的组合 编辑:我在这里找到了C#的潜在解决方案: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
<>但是,如果我必须在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...
}
}
随着不同类数量的增加,它变得有点麻烦,但它有一些优势:
动态支持。我强烈的预感是,对于物理引擎来说,速度太慢了
我还要指出,有一种方法能更好地回答这样的问题。再见我现在在C语言中做这个,但是最后,我会把它移植到C++,这样我就可以在不同的平台上使用它。这不是类似于访问者模式吗?我在一本更有效的书中读到了这一点和动态调度。但是,谢谢你这么详细的回答。正如你提到的,我不喜欢在调度表上作弊类型系统。我仍在寻找一个解决方案,如果我添加一个新类,并添加所有相应的函数来完成实体间关系的笛卡尔积,我就不必重新编译所有内容。而且,我很想了解动态系统是如何在后台解析对象并正确映射到具有正确参数类型的正确函数调用的,这与访问者模式非常相似。它基本上是一个访问者自己折叠起来,其中被访问的类和进行访问的类是同一个类(Thing
)。在其他访问者实现中,情况并非总是如此。如果您对多方法感兴趣,请看一下CLOS,Common Lisp中的对象系统。这是最著名的多方法语言。