2010-12-06 11 views
2

レンガのx座標の配列、レンガのy座標の配列、可視の天気を示す配列があります。私のコードは次のように読み取りますC#Brickbreaker gameヒット時にレンガが消えるようにする

  if (Visible[0] == 1) 
      { 
       paper.DrawRectangle(pen, BrickX[0], BrickY[0], 50, 10); 
      } 

とレンガをヒットするボールのための私の衝突のために、コードを読み取ります。ボールは、レンガを閉じる来るとき

 if (Visible[0] == 1) 
     { 
      if ((x >= BrickX[0]) && (x <= BrickX[0] + 50)) 
      { 

       if ((y >= picDisplayBat.Height - 190) && (y <= BrickY[0] + 10)) 
        yChange = -yChange; 
        Visible[0] = 0; 

をこれは、として機能していないようです衝突が起こる前にレンガは消え、ボールはそれをまっすぐに通ります。助言がありますか?

答えて

4

テストの場合は、2番目の括弧は不要です。

テストの結果にかかわらず、レンガは目に見えない状態に設定されます。

if ((y >= picDisplayBat.Height - 190) && (y <= BrickY[0] + 10)) 
{ 
    yChange = -yChange; 
} 
Visible[0] = 0; 

あなたがこの希望:あなたのコードが効果的にこれです

if ((y >= picDisplayBat.Height - 190) && (y <= BrickY[0] + 10)) 
{ 
    yChange = -yChange; 
    Visible[0] = 0; 
} 
0

を私は正確にあなたの質問に答えていますが、これは役立つかもしれません。

あなたのコードが現在何をしているのか分かりません。なぜいつも[0]

だけBrick呼ばクラスを作成し、Ball呼ばクラス:(あなたのボールは、レンガと交差する場合

class Brick { 
    public double x, y; 
    public double size; 
    public bool visible; 
}; 

class Ball { 
    public double x, y; 
    public double size; 
}; 

trueを生み出すbool Intersects(Ball ball)呼ばBrickにメンバーを紹介それらのバウンディングボックスでこれを単にチェックすることができる)。

あなたの小切手は非常に簡単になります(bricksと呼ばれるレンガの配列があると思います)。

foreach (Brick brick in bricks) { 
    if (brick.visible && brick.Intersects(ball)) { 
     // Hide the brick 
     brick.visible = false; 
    } 
} 
0

要するに、あなたは順不同の手順を実行していると思います。

あなたの2番目のルーチンはおそらく多すぎます。それは、衝突を判定し、衝突の標的の識別子を返すだけでよい。その後、消費ルーチンはその情報を使用して発射軌道を調整し(それを反映させる)、最終的に視界をオフにする。

ちなみに、衝突検出は、 "double-dispatch"という呼び出しの一般的な場所です。これをコーディングする方法として、訪問者パターン(ala Gang of Four)の使用を検討してください。

関連する問題