这是关于物理引擎的。一旦发生碰撞,它会返回两个游戏对象发生碰撞的信息。所有实体,如玩家,怪物,子弹等都是从GameObject派生(继承)。
识别哪些特定游戏对象发生冲突的好方法是什么?
枚举:我考虑过使用枚举,但是一旦开始添加更多实体,跟踪所有可能的组合就变得无法管理。
编辑:我在这里找到了一个针对C#的潜在解决方案:http://blogs.msdn.com/b/laurionb/archive/2009/08/13/multimethods-in-c-4-0-with-dynamic.aspx
但是,如果我必须在C ++中这样做,我该怎么做呢?
答案 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...
}
}
随着不同课程数量的增加,这有点麻烦,但它有一些事情要做:
缺点是:
更具扩展性的解决方案是构建一个2D调度表,其中每个单元格标识一对碰撞类。在每个单元格中,您放置一个处理这两个类类型之间冲突的函数。这也很有效,但它会欺骗类型系统。你最终会做一些演员,你必须想出一个识别课程的好方法。
我不使用C#的dynamic
支持。我强烈的预感是它对物理引擎来说太慢了。
我还要指出,有一个Game Development Stack Exchange可以更好地回答这样的问题。在那里见!