2011-02-07 14 views
1

私はここ数ヶ月間、余暇にゲームを開発してきました。私が何度も再実装して100%働いていないという固執点は、衝突の検出です。私のシステム(以下に掲載されています)はほとんどの場合ランダムに動作しますが、プレーヤーはレベルの範囲外にプッシュされているようです。私が出会った問題のチュートリアルは基本的な動作を提供するようです。オブジェクトが問題のオブジェクトに関連していることを知るためには、実際のゲームではこれを実際には知りません。ここに私の実装がありますが、私がここでやっていることを達成するための良いシステムを誰もが知っていれば、私は後になっています。2D矩形衝突検出システム(現実のゲームで動作する)

アイテムは、Rectangleと各アイテムのいくつかの他のビットを公開するIItemのコレクションに由来することに注意してください。

public void Move(float xAdditional, float yAdditional) 
    { 
     X += xAdditional; 
     Y += yAdditional; 

     foreach (var item in Level.Items) 
     { 
      if (item != this) 
      { 
       if (item.Boundary.Intersects(this.Boundary)) 
       { 
        if (item.Boundary.Top > this.Boundary.Top) //we have collided with an object below us. 
        { 
         Y = item.Boundary.Top - (this.Boundary.Height/2); 
        } 
        if(item.Boundary.Bottom < this.Boundary.Bottom)//we have collided with an object above us. 
        { 
         Y = item.Boundary.Bottom + (this.Boundary.Height/2); 
        } 
        if(item.Boundary.Left > this.Boundary.Left) //We have collided with an object to the right. 
        { 
         X = item.Boundary.Left - (this.Boundary.Width/2); 
        } 
        if(item.Boundary.Right < this.Boundary.Right)// We have collided with an object to the left; 
        { 
         X = item.Boundary.Right + (this.Boundary.Width/2); 
        } 
       } 
      } 

     } 


    } 
+0

信頼性の高い衝突応答は、自分自身を正しく得るには本当に難しい問題です。 Box2Dのようなエキスパートによって実装されたソリューションを使用するほうが、いつもより優れています。 – Empyrean

+0

ありがとうEmpyrean、チュートリアルの深刻な読書の後、私は座って、Box2Dに基づいているFarseerを使うことについて学びます。私は物事をどのようにしたいのかに最も適しているようです。それを実際に見たことは、ちょっとしたものではありません。 – Nick

答えて

1

最終的な解決策は自分自身のソリューションを落としてFarseerを実装することでした。

おかげ

私はその後、私ははるかに使用可能なビューの開発者の観点からを発見したphysics2d.netを選んだことでいくつかの時間後。

0

まず、衝突検出はオブジェクトジオメトリに大きく依存します。 線形代数数学にキャストされた複数の実績のあるソリューションは、 ですが、使用しようとしているジオメトリに依存しています。 オブジェクトのプロパティを使用してアルゴリズムを実装する代わりに、数式を直接実装し、その結果を使用して衝突が発生したかどうかを判断してください。 (ベクトルt = a-b、| t |> 0の衝突の場合、そうでない場合はベクトルのように)。あなたは、長方形や円のような単純な形状を持っている場合は

あなたはエリック Lengyelよる「3Dゲームプログラミング&コンピュータグラフィックスのための数学」へ 見てみる必要があります。

また、スプライト衝突のような他の方法 との衝突検出を実現できることに注意してください。もう1つの可能性は、より高いレベルのフレームワークを使用することです。 (たとえばOSG)

+0

あなたの入力Count0をありがとう。私の問題である衝突検出そのものではなく、物事が衝突したときにそれが感覚的に反応することを知っています。病気を確実に解決するための自分の方法を思いついてみると、痛い。うれしいです。 – Nick