2012-04-29 7 views
1

衝突検出がよりeffecient作ります。私はかなり経験の浅いプログラマは、現在のC#を学習し、一般的にはゲームデザインを学ぶためにしようとしている(C#のXNA)

私はMicrosoftのXNAフレームワークを使用して、Galaga-esque Scrolling Shooterゲームを構築しています。私はいくつかの悪い設計上の選択を行う、見掛け倒しの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つのオブジェクトは、衝突しているかどうかをチェックするのと同じセクタ(または隣接するセクタ)にあります。

私はこれに似た質問を既に投稿しましたが、私の質問にはそれほど満足できませんでした。それから私は時間管理システムが有用であることを集めました。私は最終的にそれを実装しようとするでしょうが、私はプログラミングにまだかなり新しいんだと、私はより高度な設計掘り下げる前に、自分自身をチェックし、衝突を最適化したいと思います。

私の現在の衝突チェックを効果的に最適化する方法はありますか?

答えて

3

空間パーティショニングは、すべてのオブジェクトを何らかの方法ですべてのオブジェクトと比較する必要がない方法で実装した場合にのみ役立ちます。

空間パーティショニンググリッドでは、各グリッドセル内にオブジェクトのメンバーシップリストを作成するだけでなく、各オブジェクトがそのセルを認識するようにする必要があります。次に、オブジェクトと、そのセル内およびすぐ隣接するセル内の他のすべてのオブジェクト(オブジェクトは境界を重複する可能性があるため)。欠点は、すべての状態を更新し続ける必要があることです。

他のCDトピックに加えて、いくつかの異なる幅広い段階の分割スキームとその相対的な長所と短所を扱う書籍Real-Time Collision Detectionを強くお勧めします。均一なグリッドに加えて、階層グリッド、四分木、スイープとプルーン、そしてあなたのためのより適切であり得る他の技術は、(sweep and pruneが特に有益であるかもしれない)があります。