我知道,这个话题有很多帖子,但由于我在帖子中读了两天,没有任何效果,我决定在这里提问。我有一个类似的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中绘制它。因此,我想将每个层的数据读取到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"Object reference not set to a instance of a Object"(对象引用未设置为对象的实例)。
在循环中声明
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;
}
}
在你的代码中,你总是两次都抓住同一层,而不是穿过它们。
您正在使用foreach
来迭代所有layer
标记。但在循环中,您没有使用它们。相反,您总是通过doc.Element("map").Element("layer")
访问第一层。
更换
var lay = doc.Element("map").Element("layer");
带有
var lay = layer;
您忽略了循环变量,而只使用了第一个元素。
试试这个
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;
}
}
}
}