如何存储2D瓷砖地图?

时间:2011-08-10 22:00:52

标签: c# storage tiles

考虑塞尔达传说中的瓷砖和图层:过去的链接。将这个地图存储在磁贴编辑器中的理想方法是什么?目前我使用矩形的多维数组作为单个图层。这些图块层的列表由地图组成。每个矩形对应于tileset中的矩形。但是,问题在于编辑地图时应该允许编辑地图大小(宽度,高度和图层数)。

目前,当有人编辑地图的尺寸​​时,我只需创建一个具有指定尺寸的新数组。这工作正常,但现在我正在添加Undo和Redo支持它开始使事情变得复杂,因为每次用户更改地图的尺寸​​时我都必须在每次更改之前存储整个地图的副本。现在我正在考虑其他方式。

只有MAX映射大小才能更好,只需在启动时调整大小,这样我就不必创建新数组并经常复制数据了吗?或许可以使用列表列表而不是多维数组?

我不确定我对目前的设置感觉如何。最初我很好,但现在我有了第二个想法。我目前没有注意到放慢速度,所以也许我正在进行过早的优化(当然这很糟糕)并且应该忘掉这整篇文章。我不确定。我想听听你们的想法。

1 个答案:

答案 0 :(得分:0)

出于撤销/重做操作的目的,您可以安全地假设不需要进行优化,原因如下。

1)通常不会使用撤消/重做操作来更改地图尺寸。通常,在编辑地图时,尺寸不会经常变化。

2)即使使用撤消/重做操作,重新创建阵列也不是一个大问题。

您可以将“Tile”存储为自己的对象,并使数组中的每个元素都是对“Tile”对象的引用。在32位计算机上,256x256映射应该需要256 KB用于磁贴引用,而1024x1024映射应该是4 MB用于磁贴引用。图块中的数据本身可以保留在内存中而不会被移动。

4 MB阵列副本在现代计算机上不会占用任何明显的时间。

如果数据大小必须更大,那么最佳解决方案是警告用户无法撤消更改维度。用户应在更改尺寸之前保存地图的副本。同样,尺寸不会经常变化,并且由于地图在尺寸变化后通常会完全不同,因此用户可能倾向于拥有先前版本的副本。