2014-10-22 102 views
0

我有一個瓷磚列表。每個瓦片包含一個Vector2和一個紋理。簡單的瓷磚類。C#XNA移除瓷磚組

List<Tile>tiles = new List<Tile>(); 

如果我在羣磚的中心單擊,說一個網格,是10×10,我怎麼能去除瓷磚在某些×2區域。或者我如何根據他們的位置來操作已經添加到列表中的圖塊?有沒有比每個週期遍歷它們更容易的方法,並將位置匹配到瓷磚?

對不起,如果這是一個令人困惑的問題。我不知道該怎麼說。

回答

1

您必須循環才能找到您選擇的拼塊,然後當您發現它們設置了像「RemoveThis = true」之類的標誌時。一種解決方案是使用Vector2D.Distance,因此您可以比較每個圖塊與您點擊的位置之間的距離。

有很多不同的算法,但看起來你需要切比雪夫距離方法:http://en.wikipedia.org/wiki/Chebyshev_distance

然後你就可以刪除所有這些磚:tiles.removeAll(function(c) c.RemoveThis)

1

什麼你可能希望做的是有一個更容易方式來操縱你的數據。在這裏使用列表並不是更好的方法。

我會建議使用數組來代替。例如:

//Init 10x10 tile array 
int Width = 10; 
int Height = 10; 
Tile[] Tiles = new Tile[Width, Height]; 

要添加項目到這個集合,你會怎麼做:

for (int x = 0; x < Width; x++) 
    for (int y = 0; y < Height; y++) 
     Tiles[x, y] = new Tile(); 

然後刪除一組用於連接磚,它是那樣簡單:

void DeleteTiles(int x, int y) 
{ 
    Tiles[x, y] = null; 
    Tiles[(x+1) % Width, y] = null; 
    Tiles[x, (y+1) % Height] = null; 
    Tiles[(x+1) % Width, (y+1) % Height] = null; 
}