0

這是關於物理引擎。一旦發生碰撞,它會返回兩個gameObjects發生碰撞的信息。所有實體,如玩家,怪物,子彈等都是從GameObject派生(繼承)的。什麼是識別哪個特定遊戲物體碰撞的好方法?

什麼是確定哪個特定遊戲物體碰撞的好方法?

枚舉:我曾考慮過使用枚舉,但只要您開始添加更多的實體,就不可能管理所有可能的組合。

編輯:我發現這裏一個潛在的解決方案爲C#:http://blogs.msdn.com/b/laurionb/archive/2009/08/13/multimethods-in-c-4-0-with-dynamic.aspx

但儘管如此,如果我要做到這一點在C++中,我將如何做呢?

+0

涉及哪些語言? – Kurru 2011-01-30 00:59:03

+0

好吧,我現在正在c#中完成這個工作,但最終我會將它移植到C++中,這樣我就可以在不同的平臺上使用它。 – brainydexter 2011-01-30 01:01:11

回答

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. 它是類型安全的。你會注意到沒有演員正在進行。

的缺點是:

  1. 它不是開放式的分機。添加一個新課程需要您觸摸 所有其他課程。

一個更可擴展的解決方案是構建一個2D調度表,其中每個單元格標識一對碰撞類。在每個單元格中,您將一個函數處理這兩個類類型之間的衝突。這也行得通,但它有點欺騙類型系統。你最終會做一些演員,你必須想出一個很好的方法來確定一個班級。

我會不是使用C#的dynamic支持。我強烈的預感是它對物理引擎來說太慢了。

我還會指出,有一個Game Development Stack Exchange在回答這樣的問題方面好得多。到時候那裏見!