0

これは物理エンジンに関するものです。衝突が発生すると、2つのgameObjectが衝突しているという情報が返されます。プレーヤー、モンスター、弾丸などのすべてのエンティティは、GameObjectから派生(継承)されます。

どの特定のgameObjectが衝突しているかを識別する良い方法は何ですか?

列挙型:列挙型の使用を検討しましたが、エンティティを追加し始めるとすぐに、考えられるすべての組み合わせを追跡することが管理できなくなります。

編集:ここでC#の潜在的な解決策を見つけました:http://blogs.msdn.com/b/laurionb/archive/2009/08/13/multimethods-in-c-4-0-with-dynamic.aspx

しかし、それでも、C ++でこれを実行する必要がある場合、どのように実行しますか?

4

1 に答える 1

1

典型的な解決策は、次のように 2 つのレベルのディスパッチを行うことです。

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 ディスパッチ テーブルを構築することです。各セルには、これら 2 つのクラス タイプ間の衝突を処理する関数を配置します。これもうまく機能しますが、型システムを少しごまかしています。いくつかのキャストを行うことになり、クラスを識別するための適切な方法を考え出す必要があります。

C# のサポートは使用しません。dynamic私の強い予感は、物理エンジンには遅すぎるということです。

また、このような質問への回答に優れたGame Development Stack Exchangeがあることも指摘しておきます。それではお会いしましょう!

于 2011-02-03T19:24:41.500 に答える