我知道,这个话题有很多帖子,但是由于我在帖子中看了两天而没有任何效果,我决定在这里问一下。 我有一个像这样的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>
它是一个具有不同图层的(tile-)地图,我想在XNA中绘制它。因此,我想将每个层中的数据读入string[]
这是我尝试过的,但它不适用于第二个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“对象引用未设置为对象的实例。”
答案 0 :(得分:3)
你在循环中声明
var lay = doc.Element("map").Element("layer");
这是不必要的,因为你已经拥有了单独的图层。您需要完全删除该行并使用foreach循环中的layer
变量。循环内部现在看起来应该是这样的
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;
}
}
在你的代码中,你总是两次抓住同一层,而不是单步执行它们。
答案 1 :(得分:2)
您正在使用foreach
来迭代所有layer
个代码。但是在循环内部,你没有使用它们。相反,您始终通过doc.Element("map").Element("layer")
访问第一个图层。
答案 2 :(得分:1)
替换
var lay = doc.Element("map").Element("layer");
与
var lay = layer;
您只是忽略循环变量,而只使用第一个元素。
答案 3 :(得分: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;
}
}
}
}