2012-04-07 85 views
1

所以我想在C#.NET中做一個Tron LightBike遊戲,但是當兩個玩家同時碰撞(或碰撞時)時,我遇到了一個問題。在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的順序時(藍色添加第二),然後紅色勝出。我相信這與我檢查碰撞的方式有關。我認爲,特別是它在drawBikes我foreach循環做...

這裏是drawBikes方法:

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); 
     } 

爲什麼正當紅的球員得到去除,而不是藍色的播放器以及(自他們都應該在本質上同時擊中對方)?我應該創建更多的線程?我覺得這是不必要的...

這裏是我的isValidLocation()代碼:

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 2012-04-07 09:16:33

+0

謝謝!無論如何,我正在尋找這個功能。 – 2012-04-09 17:26:22

回答

2

我相信你的問題是,你在呼喚getNextLocation()在每個循環,隨後直接碰撞檢查。如果自行車A是第一個在循環中處理的,它的位置被更新,發現與自行車B相撞,並且可能被刪除(我不知道你在else語句後用你的列表做了什麼)。當循環移動到自行車B上時,不再有另一輛自行車碰撞。

你的代碼:

  1. 環比自行車和在網格上更新自己的位置。
  2. 在自行車上循環,檢查每個是否發生碰撞,並執行碰撞邏輯。
  3. 在新的位置繪製每輛自行車。

如果自行車在碰撞在步驟2中,它是從自行車的列表中移除(或者以某種方式標記),並在步驟3中沒有畫出 這裏的關鍵是,更新的自行車在檢查碰撞之前,位置完全完成,並且延遲繪圖直到處理完所有碰撞邏輯。