1

私はかなり経験の浅いプログラマーで、現在C#を学び、ゲームデザイン全般を学ぼうとしています。

私はMicrosoftのXNAフレームワークを使用して、ガラガ風のスクロールシューティングゲームを構築しています。粗雑なOOP構造に苦労し、いくつかの悪い設計選択を行ったいくつかの大まかな試行の後、私はついにエンジンの立派な始動を思いつきました。

現在、衝突検出をゲームに遅れさせないようにすることに問題があります。私の現在のエンジンは、すべてのアクティブなゲームオブジェクトをリストオブジェクトに保持し、それぞれを循環して、互いに衝突するかどうかをチェックします。言うまでもなく、それははるかに良いかもしれません。

これが、ObjectHandlerクラスで実行される衝突チェックです。

public override void Update(GameTime gameTime)
    {
    ...
        //Handle collisions
        foreach (GameObject obj in Objects)
        {
            ICollideable e = obj as ICollideable;
            //Check if the object implements ICollideable
            if (e != null)
            {
                //Check collision with each other object
                foreach (GameObject obj2 in Objects)
                {
                    //Check if the second object implements ICollideable
                    ICollideable e2 = obj2 as ICollideable;
                    //check if they are in the same sector
                    if (e2 != null && SameSector(e.Sector,e2.Sector))
                    {
                        //Check if the collision masks interesect
                        //if so call each object's collision event
                        if (e.Mask.Intersects(e2.Mask))
                        {
                            e.CollisionEvent(e2);
                            e2.CollisionEvent(e);
                        }
                    }
                }
            }
        }
      ...
    }

これがSameSector関数です。

private bool SameSector(Point p1, Point p2)
    {
        if (Math.Abs(p1.X-p2.X)<=1 && Math.Abs(p1.Y-p2.Y)<=1)
            return true;
        else 
            return false;
    }

ここでの「マスク」は、XNAフレームワークの一部であるRectangleオブジェクトです。ご覧のとおり、私は一種の空間分割システムを実装しました。各オブジェクトは、60x60の正方形を設定します。ただし、チェックするのに同じくらいの時間がかかるため、何か便利なことをしたかどうかはわかりません。 2つのオブジェクトは、衝突しているかどうかを確認するのと同じセクター(または隣接するセクター)にあります。

この投稿に似た質問をすでに見ましたが、それは私の質問を完全には満足させませんでした。それから、時間管理システムが便利であることがわかりました。最終的にはそれを実装しようとしますが、プログラミングはまだかなり新しいので、より高度な設計を掘り下げる前に、衝突チェック自体を最適化したいと思います。

それで、現在の衝突チェックを効果的に最適化する方法はありますか、それとも最初から方法がありますか?

4

1 に答える 1

3

空間分割は、何らかの方法ですべてのオブジェクトをすべてのオブジェクトと比較する必要がない方法で実装した場合にのみ役立ちます。

空間分割グリッドでは、各グリッドセルにオブジェクトのある種のメンバーシップリストを持たせ、各オブジェクトがどのセルにあるかを認識できるようにします。次に、オブジェクトとすべてのセルを比較するだけで済みます。そのセル内およびすぐ隣のセル内の他のオブジェクト(オブジェクトが境界と重なる可能性があるため)。欠点は、このすべての状態を最新の状態に保つ必要があることです。

他のCDトピックに加えて、いくつかの異なる広相分割スキームとそれらの相対的な長所と短所を詳細にカバーする本Real-TimeCollisionDetectionを強くお勧めします。均一なグリッドに加えて、階層グリッド、四分木、スイープとプルーニング、およびより適切なその他の手法があります(スイープとプルーニングが特に有益な場合があります)。

于 2012-04-29T20:29:56.313 に答える