典型的解決方案是做調度的兩個層次是這樣的:
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在回答這樣的問題方面好得多。到時候那裏見!
涉及哪些語言? – Kurru 2011-01-30 00:59:03
好吧,我現在正在c#中完成這個工作,但最終我會將它移植到C++中,這樣我就可以在不同的平臺上使用它。 – brainydexter 2011-01-30 01:01:11