0

私は Xna にかなり慣れていないので、XML ファイルを読み込んで読みたいと思っています。インターネットで何時間も検索した後でも、ファイルがロードされません。開始しようとするたびに (DirectoryNotFoundException) が発生し、デバッグ ディレクトリにコピーしようとすると (NullReferenceException) が発生します。

ダウンロード: http://www.mediafire.com/?z6w36b73cufy3co

読み込み方法: (コードには 2 つ目のコードがありますが、とにかくプロジェクト全体をアップロードします)

    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

それを達成するには、次の 2 つの方法があります。

A) コンテンツ パイプラインの使用

Xbox ゲームからロードする場合は、これを選択します。インポーターと、それをロードして返すプロセッサーを次のように作成します。

  1. 文字列。

  2. またはあなたのレベルタイプ

B) System.IO の使用

ファイルをソリューションに追加し、ファイルのプロパティに移動して、[出力フォルダーにコピー] オプションを [常にコピー] に設定すると、実行可能ファイルに関連するフォルダーからファイルを読み込むことができます。コードに必要なもののようですが、xbox ゲームでは機能しません。

編集

私はあなたのコードをデバッグしました...

1) 「常にコピーするオプション」を「alientypes.xml」と「levels.xml」の両方のファイルに設定する必要があります。

2)「alienTypes」フィールドをロードする前に「InitLevel」を呼び出すため、このフィールドはnullです...したがって、InitLevelsはnull参照例外を与えます....

  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) デバッグを容易にするためにコードを修正しました...今では簡単に追跡でき、失敗した場所を見つけることができます...その「エイリアンタイプ」は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" )];
        .....

編集2

エイリアン タイプの xml にはいくつかのエラーがあります...ボスには「スペース」属性が必要であり、エイリアン 1 のパス Texture="Texures/sprites" は Texture="Textures/sprites" である必要があります...

于 2012-11-11T10:45:29.740 に答える