2010-07-08 70 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数组不同,它有多种复制/组合多维数组的方式。

你不会变得更快,我认为它是完全可维护的。无论如何,它似乎就像漂亮的固定代码。