我是Xna的新手,我想加载和读取XML文件。 在互联网上搜索了几个小时后,我仍然没有得到它没有加载文件。 每当我尝试启动它时都有一个(DirectoryNotFoundException),当我尝试将它复制到调试目录时,有一个(NullReferenceException)
下载:http://www.mediafire.com/?z6w36b73cufy3co
加载方法:(代码中的第二个,但无论如何我都会上传整个项目)
private void InitLevel(int levelNum)
{
actlevel = levelNum;
levelData = (from level in XElement.Load("Data\\Levels.xml").Descendants("Level")
where (int)level.Attribute("Number") == levelNum
select new LevelData
{
number = levelNum,
changeDirChance = (int)level.Attribute("ChangeDirChance"),
maxActiveAliens = (int)level.Attribute("MaxActiveAliens"),
totalAliensToFinish = (int)level.Attribute("TotalAliensToFinish"),
boss = alienTypes[(string)level.Attribute("Boss")],
fireChance = (int)level.Attribute("FireChance"),
maxAlienBullets = (int)level.Attribute("MaxAlienBullets"),
alienGenerationTime = TimeSpan.FromMilliseconds((int)level.Attribute("AlienGenerationTime")),
selectionData = (from sel in level.Descendants("AlienType")
select new AlienSelectionData
{
chance = (int)sel.Attribute("Chance"),
alien = alienTypes[(string)sel.Attribute("Name")]
}).ToList()
}).SingleOrDefault();
Debug.Assert(levelData != null);
}
和XML文件(/ Data中的Levels.xml):
<?xml version="1.0" encoding="utf-8" ?>
<Levels>
<Level Number="1" MaxActiveAliens="7" TotalAliensToFinish="15" Boss="boss1"
AlienGenerationTime="800" ChangeDirChance="2" FireChance="2" MaxAlienBullets="5">
<AlienTypes>
<AlienType Name="alien1" Chance="25" />
<AlienType Name="alien2" Chance="20" />
<AlienType Name="alien3" Chance="20" />
<AlienType Name="alien4" Chance="5" />
</AlienTypes>
</Level>
<Level Number="2" MaxActiveAliens="10" TotalAliensToFinish="25" Boss="boss2"
AlienGenerationTime="600" ChangeDirChance="2" FireChance="3" MaxAlienBullets="7">
<AlienTypes>
<AlienType Name="alien1" Chance="20" />
<AlienType Name="alien2" Chance="20" />
<AlienType Name="alien3" Chance="20" />
<AlienType Name="alien4" Chance="15" />
<AlienType Name="alien5" Chance="10" />
</AlienTypes>
</Level>
</Levels>
答案 0 :(得分:0)
你有两种选择来实现它:
A)使用内容管道
如果你想从Xbox游戏中加载它,这是一个选择。 使导入器和处理器加载并将其返回为:
一个字符串。
或您的等级类型
B)使用System.IO
将文件添加到解决方案并转到文件属性并将“复制到输出文件夹”选项设置为“始终复制”,您将能够从相对于可执行文件的文件夹加载文件。这似乎是您的代码所需要的,但它在xbox游戏中不起作用。
我调试了你的代码......
1)您必须为“alientypes.xml”和“levels.xml”文件设置“始终复制选项”
2)在加载“alienTypes”字段之前调用“InitLevel”,因此该字段为空...所以InitLevelsgive为空引用异常....
public void Initialize( ContentManager Content )
{
player.Initialize( );
stars.Initialize( width, height );
shot.Initialize( );
---> InitLevel( 1 );
// XML Datei
---> alienTypes = (from at in XElement.Load( "data/alientypes.xml" ).Descendants( "AlienType" )
select new AlienType.....
3)我已经修改了你的代码以便更容易地调试它...现在很容易跟踪它找到失败的地方......“alientypes”为null ..
private void InitLevel( int levelNum )
{
actlevel = levelNum;
var levels = XElement.Load( "Data\\Levels.xml" ).Descendants( "Level" );
var level = levels.Where( l => ( int ) l.Attribute( "Number" ) == levelNum ).SingleOrDefault( );
levelData = new LevelData( );
levelData.number = levelNum;
levelData.changeDirChance = ( int ) level.Attribute( "ChangeDirChance" );
levelData.maxActiveAliens = ( int ) level.Attribute( "MaxActiveAliens" );
levelData.totalAliensToFinish = ( int ) level.Attribute( "TotalAliensToFinish" );
----> levelData.boss = alienTypes[( string ) level.Attribute( "Boss" )];
.....
你的外星人类型xml有几个错误......老板需要“space”属性,而alien1的路径Texture =“Texures / sprites”应该是Texture =“Textures / sprites”......