【问题标题】:How to convert List<T> into T[,]如何将 List<T> 转换为 T[,]
【发布时间】: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&lt;Tile&gt; 转换为List[,]

我决定使用多维数组来存储图块的原因是因为它在程序中使用起来更容易、更快捷。当更多瓦片添加到地图工作空间时,使用列表执行此操作会导致程序显着变慢。

【问题讨论】:

  • 您是否考虑过实现set 部分的TileList 属性?
  • 是的。这样做的主要问题是我无法获取地图的宽度和高度,因此我可以使用这些属性创建 Tile[,]。当我将图层添加到我的地图时,它会创建一个空的 Tile[,] 并使用以下代码:Layer.Tiles = new Tile[(int) Math.Floor((double) (MapSize.Width / TileSize)), (int) Math.Floor((double) (MapSize.Height / TileSize))]
  • 为什么不在类中存储这些值?您似乎正在尝试在没有所有必要数据可用的情况下重新创建您的状态。
  • 除非您将维度存储在某处(或可以计算),否则您无法将List&lt;Tile&gt; 转换为Tile[,],因为您不知道每个维度中有多少。例如。如果有 4 个图块,是 1x4、2x2 还是 4x1?
  • 我已经尝试过了,但是在使用 TileList 属性的 set 部分时,我收到“除以零”错误 - 它不会检索地图大小和图块大小值。

标签: c# xml arrays list multidimensional-array


【解决方案1】:

不就是这样吗?

[XmlIgnore]
public Tile[,] Tiles { get; set; }

[XmlElement("Tile")]
[EditorBrowsable(EditorBrowsableState.Never)]
public List<Tile> TileList
{
    /* existing code */
    set
    {
        Tiles = new Tile[MapWidth, MapHeight];
        for(int i=0;i < value.Count;i++) {
            int x = i % mapWidth;
            int y = i / mapWidth; // integer division truncates so this is ok

            Tiles[x, y] = value[i];
        }
    }
}

【讨论】:

  • 地图的宽度和高度默认为 480x480,但我可以在创建新地图时定义新尺寸。当我保存地图时,它会序列化所有数据: Map: List: List 问题是,当我反序列化这些数据时,我不知道如何获取地图宽度和高度,以便 Tile 可以使用它。
  • 整数除法截断,与四舍五入不同。例如 -1 / 2 是 0 而不是 -1。
  • @KevinDeLorey - 是的,我知道它会被截断,因此在吓人的引号中“四舍五入”。我会将答案更改为截断。抱歉不清楚。
  • @Dragonphase - 是的。您必须将地图宽度存储为单独的数据(然后您可以使用它来计算高度) - 除非您修改瓷砖,否则实际上没有其他方法可以做到这一点,因此有一个“行尾”瓷砖或类似的东西
猜你喜欢
  • 1970-01-01
  • 2019-04-13
  • 1970-01-01
  • 2010-11-18
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多