0

我对 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>
4

1 回答 1

0

您有两种选择来实现它:

A) 使用内容管道

如果您想从 Xbox 游戏加载它,这是选择。制作一个导入器和一个处理器,将其加载并返回为:

  1. 一个字符串。

  2. 或者你的关卡类型

B) 使用 System.IO

将文件添加到解决方案并转到文件的属性并将选项“复制到输出文件夹”设置为“始终复制”,您将能够从相对于可执行文件的文件夹中加载文件。这似乎是您的代码所需要的,但它在 xbox 游戏中不起作用。

编辑

我已经调试了你的代码...

1)您必须将“始终复制选项”设置为文件“alientypes.xml”和“levels.xml”

2)在加载“alienTypes”字段之前调用“InitLevel”,因此该字段为空......所以InitLevels给出一个空引用异常......

  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”为空......

    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" )];
        .....

编辑 2

你的外星人类型xml有几个错误...老板需要“space”属性,alien1的路径Texture="Texures/sprites"应该是Texture="Textures/sprites"...

于 2012-11-11T10:45:29.740 回答