2012-04-07 7 views
1

C#.NETでTron LightBikeゲームを作ろうとしていますが、同時に2人のプレーヤーが衝突したとき(または衝突時に頭部)に問題が発生しています。ここでTronゲームでの衝突タイミングの検出

bikes = new ArrayList(); 
bikes.Add(new LightBike(new Point(500, 10), Color.Blue, "left", new DirectionKeys(Keys.Left, Keys.Down, Keys.Up, Keys.Right))); //blue player facing right 
bikes.Add(new LightBike(new Point(10, 10), Color.Red, "right", new DirectionKeys(Keys.A, Keys.S, Keys.W, Keys.D))); //red player facing left 
grid = new int[this.Size.Width, this.Size.Height]; //create the grid map 
drawThread = new Thread(drawBikes); 

最初のプレイヤーは常に追加衝突のヘッドがあるときに勝利のように思え...私は選手たちを初期化する方法です。バイクがArrayListに追加される順序を変更すると(青が2番目に追加されます)、赤が優先されます。私はそれが私が衝突をチェックしている方法と関係があると信じています。以来、(ちょうど赤プレイヤーが同様に青色のプレーヤーを削除していない取得しないのはなぜ

while (true) 
{ 

    ArrayList deleteBikes = new ArrayList(); 
    foreach (LightBike b in bikes) 
    { 
     if (isValidLocation(b.getNextLocation())) 
     { 
      canvas.DrawLine(new Pen(b.color, BIKE_SIZE), b.location, b.getNextLocation()); 
      b.location = b.getNextLocation(); 
      grid[b.location.X, b.location.Y] = bikes.IndexOf(b)+1; 
     } 
     else 
     { 
      deleteBikes.Add(b); 
     } 

:私はここに

がdrawBikes方法です...具体的にはdrawBikesの私のforeachループに関係していると思います彼らは両方とも本質的にお互いに同時に打つべきです)?スレッドをさらに作成する必要がありますか?私はあなたの問題はあなたが各ループの中に衝突チェックによって直接続くgetNextLocation()を呼び出していることであると考えてい

public Boolean isValidLocation(Point x) 
{ 
     if (x.X < this.Size.Width && x.X > 0) 
      if (x.Y < this.Size.Height && x.Y > 0) 
       if (grid[x.X, x.Y] == 0) 
        return true; 

    return false; 
} 
+0

可能であれば、ArrayListを使用しないでください。代わりに汎用リスト 'List 'を使用してください。 – svick

+0

ありがとう!とにかくその機能を探していました。 –

答えて

2

:私はそれが不要である...ここで

は私isValidLocationある()のコードのように感じます。自転車Aがループ内で最初に処理される場合、その位置が更新され、自転車Bとの衝突が検出され、おそらく削除されます(else文の後にdeleteBikesのリストを使って何をするのかわかりません)。ループがバイクBに移動すると、もはや衝突する別のバイクはありません。

あなたのコードはすべきである:バイクオーバー

  1. ループおよびグリッド上の位置を更新します。
  2. バイクをループし、それぞれが衝突していないかどうかを確認し、衝突ロジックを実行します。
  3. 各自転車を新しい位置に描きます。自転車は、ステップ2に衝突していた場合

は、それがバイクのリストから削除(あるいは何らかの方法でフラグを立て)、そしてステップ3で描かれていないされて ここで重要なのは、そのバイクを更新位置は完全に終了してから衝突をチェックし、すべての衝突ロジックが処理されるまで描画が延期されます。