2010-07-08 69 views
0

我正在使用基於tilebased的地圖在客戶端 - 服務器遊戲上工作。 如果用戶更改地圖的可見部分(即以任何方向滾動),我向服務器查詢有關給出X,Y,寬度和高度的新部分的信息。C#:複製二維數組的部分

的地圖信息被存儲爲2D陣列

MapTile[,] 

(MapTile是一個簡單的結構)

當客戶端請求一個新的部分我想讀從地圖瓦片陣列的部分,爲我定義的方法

public MapTile[,] GetMapSection(Rectangle area) 
{ 
    [... snip validation ...] 
    MapTile[,] result = new MapTile[area.Width, area.Height]; 

    for (Int32 y = 0; y < area.Height; ++y) 
    { 
    for (Int32 x = 0; x < area.Width; ++x) 
    { 
     result[x, y] = this.map[x + area.X, y + area.Y]; 
    } 
    } 
    return result; 
} 

是否有更簡單(=>更易於閱讀,理解和維護,不一定更快)的方式獲得來自陣列的部分?

+0

爲arraycopy在MS例如一個鏈接爲什麼你不讓當一個人開始遊戲遊戲加載整個地圖?我沒有看到通過多次查詢一個小矩陣而得到的結果。你有足夠的內存。 ;-) 對於你的問題:你可以組織你的數組到一維數組,然後只是arraycopy你需要的部分。 1Darray [X + Y *尺寸] = 2DArray [X] [Y]。 – InsertNickHere 2010-07-08 13:18:58

+0

地圖在每個方向上可以有幾千個大的瓦片。我們估計10000x7500瓷磚的大小。 – dbemerlin 2010-07-08 13:24:38

+0

將二維數組轉換爲一維數組當然是可能的,但對於像this.map [GetIndex(map,x,y)]或this.map [x +(y * dimension)]這樣的大量調用, 。不太好看。 – dbemerlin 2010-07-08 13:29:58

回答

3

不是。這看起來像一個明智和簡單的方法來做到這一點。 .NET不提供任何內置方法的原因是,與1D數組不同,它有多種複製/組合多維數組的方式。

你不會變得更快,我認爲它是完全可維護的。無論如何,它似乎就像漂亮的固定代碼。