1

我知道,这个主题有很多帖子,但是由于我在帖子中阅读了两天但没有任何效果,所以我决定在这里问。我有一个像这样的 XML (Level01.xml) 文件

<map version="1.0">
 <tileset>
  <image source="....>
 </tileset>
 <layer name="background">
     <data encoding="csv">
     3,3,3,3,3,3,3,
     3,3,3,3,3,3,3,
     3,3,3,3,3,3,3,
     3,3,3,3,3,3,3
     </data>
 </layer>
 <layer name="walls">
     <data encoding="csv">
     182,182,182,182,182,8,8,
     182,8,182,8,8,8,8,
     182,182,182,182,182,8,8,
     182,8,182,8,8,8,8,
     </data>
 </layer>
</map>

它是具有不同图层的(平铺)地图,我想在 XNA 中绘制它。因此,我想将每一层的数据读入 astring[] 这是我尝试过的,但它不适用于第二个string[] walldata,我非常绝望,因为我不明白为什么

public class LevelXmlReader
{
    public string[] backgroundData;
    public string[] wallData;

    LevelXmlReader()
    {
        XDocument doc = XDocument.Load(@"Level/Level01.xml");
        foreach (XElement layer in doc.Element("map").Descendants("layer"))
        {

            var lay = doc.Element("map").Element("layer");
            var layName = lay.Attribute("name").Value;
            switch (layName)
            {
                case "background":
                    {
                        backgroundData = lay.Element("data").Value.Split(',');
                    }
                    break;
                case "walls":
                    {
                        wallData = lay.Element("data").Value.Split(',');
                    }
                    break;
            }

        }

    }

}

当我尝试绘制wallData时,总是出现 ExceptionError "Object reference not set to an instance of an object."

4

4 回答 4

3

在你的循环内你要声明

var lay = doc.Element("map").Element("layer");

这是不必要的,因为您已经拥有单独的层。您需要完全删除该行并使用layerforeach 循环中的变量。循环的内部现在应该是这样的

foreach (XElement layer in doc.Element("map").Descendants("layer"))
{
    switch (layer.Attribute("name").Value)
    {
        case "background":       
            backgroundData = layer.Element("data").Value.Split(','); 
            break;

        case "walls":
            wallData = layer.Element("data").Value.Split(',');
            break;
    }
}

在您的代码中,您总是两次抓取同一层,而不是单步执行它们。

于 2013-02-05T14:39:51.787 回答
2

您正在使用 aforeach来迭代所有layer标签。但是在循环内部,您没有使用它们。相反,您总是通过doc.Element("map").Element("layer").

于 2013-02-05T14:39:03.687 回答
1

代替

var lay = doc.Element("map").Element("layer");

var lay = layer;

您忽略了循环变量,而仅使用第一个元素。

于 2013-02-05T14:39:05.013 回答
1

尝试这个

public class LevelXmlReader
{
    public string[] backgroundData;
    public string[] wallData;

    LevelXmlReader()
    {
        XDocument doc = XDocument.Load(@"Level/Level01.xml");
        foreach (XElement layer in doc.Element("map").Descendants("layer"))
        {
            var layName = layer.Attribute("name").Value;
            switch (layName)
            {
                case "background":
                    backgroundData = layer.Element("data").Value.Split(',');
                    break;

                case "walls":
                    wallData = layer.Element("data").Value.Split(',');
                    break;
            }
        }
    }
}
于 2013-02-05T14:39:22.223 回答