【发布时间】:2014-02-05 20:50:43
【问题描述】:
我目前正在为游戏创建地图编辑器,但遇到了一些复杂问题。我正在使用多维平铺数组 (Tile[,]) 来存储在地图工作区上绘制的平铺,并将它们保存到 XML,我使用以下代码:
[XmlIgnore]
public Tile[,] Tiles { get; set; }
[XmlElement("Tile")]
[EditorBrowsable(EditorBrowsableState.Never)]
public List<Tile> TileList
{
get
{
var tiles = new List<Tile>();
for (var x = 0; x < Tiles.GetLength(0); x ++)
{
for (var y = 0; y < Tiles.GetLength(1); y ++)
{
tiles.Add(Tiles[x, y]);
}
}
return tiles;
}
}
这段代码让我可以成功地将我创建的任何地图转换为 XML 格式。瓦片以字符串形式保存源瓦片集图像位置、瓦片集图像的源点位置以及地图上瓦片的点位置。其他属性已成功存储,例如图块标志。
问题是,当我想反序列化这个 XML 文件以便我可以加载地图时,它在到达 TileList 属性时遇到了麻烦。我想要做的是将读入的List<Tile> 转换为List[,]。
我决定使用多维数组来存储图块的原因是因为它在程序中使用起来更容易、更快捷。当更多瓦片添加到地图工作空间时,使用列表执行此操作会导致程序显着变慢。
【问题讨论】:
-
您是否考虑过实现
set部分的TileList属性? -
是的。这样做的主要问题是我无法获取地图的宽度和高度,因此我可以使用这些属性创建
Tile[,]。当我将图层添加到我的地图时,它会创建一个空的Tile[,]并使用以下代码:Layer.Tiles = new Tile[(int) Math.Floor((double) (MapSize.Width / TileSize)), (int) Math.Floor((double) (MapSize.Height / TileSize))] -
为什么不在类中存储这些值?您似乎正在尝试在没有所有必要数据可用的情况下重新创建您的状态。
-
除非您将维度存储在某处(或可以计算),否则您无法将
List<Tile>转换为Tile[,],因为您不知道每个维度中有多少。例如。如果有 4 个图块,是 1x4、2x2 还是 4x1? -
我已经尝试过了,但是在使用
TileList属性的set部分时,我收到“除以零”错误 - 它不会检索地图大小和图块大小值。
标签: c# xml arrays list multidimensional-array