2017-09-24 3 views
1

基本的なテキストベースのRPGを作成しており、xmlを使用してゲームを保存しようとしています。これは、xmlからプレーヤーデータを呼び出すコードです。基本的なゲームでXMLファイルを読み取るC#コードを取得する方法

public class SuperAdventure() { 
    private Player _player; 

    private Monster _currentMonster; 

    private const string PLAYER_DATA_FILE_NAME = "PlayerData.xml"; 

    public SuperAdventure() 
    { 
     InitializeComponent(); 

     if (File.Exists(PLAYER_DATA_FILE_NAME)) 
     { 
      _player = Player.CreatePlayerFromXmlString(File.ReadAllText(PLAYER_DATA_FILE_NAME)); 
     } 
     else 
     { 
      _player = Player.CreateDefaultPlayer(); 
     } 

     MoveTo(_player.CurrentLocation); 
     UpdatePlayerStats(); 
    } 
} 

xmlが正しく作成されていることも確認しています。ゲームを閉じると、私は手動でxmlを見つけることができます。すべてのステータスは保存されますが、ゲームが再開されると、プレイヤーはデフォルトのステータスとアイテムにリセットされます。関数呼び出しの順序が重要かどうか、またはxmlの作成がxmlのゲーム使用に影響するかどうかはわかりません。

 public static Player CreatePlayerFromXmlString(string xmlPlayerData) 
    { 
     try 
     { 
      XmlDocument playerData = new XmlDocument(); 

      playerData.LoadXml(xmlPlayerData); 

      int currentHitPoints = Convert.ToInt32(playerData.SelectSingleNode("/Player/Stats/CurrentHItPoints").InnerText); 
      int maximumHitPoints = Convert.ToInt32(playerData.SelectSingleNode("/Player/Stats/MaximumHitPoints").InnerText); 
      int gold = Convert.ToInt32(playerData.SelectSingleNode("/Player/Stats/Gold").InnerText); 
      int experiencePoints = Convert.ToInt32(playerData.SelectSingleNode("/Player/Stats/ExperiencePoints").InnerText); 

      Player player = new Player(currentHitPoints, maximumHitPoints, gold, experiencePoints); 

      int currentLocationID = Convert.ToInt32(playerData.SelectSingleNode("/Player/Stats/CurrentLocation").InnerText); 
      player.CurrentLocation = World.LocationByID(currentLocationID); 

      foreach (XmlNode node in playerData.SelectNodes("/Player/InventoryItems/InventoryItem")) 
      { 
       int id = Convert.ToInt32(node.Attributes["ID"].Value); 
       int quantity = Convert.ToInt32(node.Attributes["Quantity"].Value); 

       for (int i = 0; i < quantity; i++) 
       { 
        player.AddItemToInventory(World.ItemByID(id)); 
       } 
      } 

      foreach (XmlNode node in playerData.SelectNodes("/Player/PlayerQuests/PlayerQuest")) 
      { 
       int id = Convert.ToInt32(node.Attributes["ID"].Value); 
       bool isCompleted = Convert.ToBoolean(node.Attributes["IsCompleted"].Value); 

       PlayerQuest playerQuest = new PlayerQuest(World.QuestByID(id)); 
       playerQuest.IsCompleted = isCompleted; 

       player.Quests.Add(playerQuest); 
      } 

      return player; 
     } 
     catch 
     { 
      //If there was an error with the XML data, return a default player object 
      return Player.CreateDefaultPlayer(); 
     } 
    } 
+1

する必要があり、あなたの質問のタイトルは、あなたのゲームのニーズに取り組んでXMLソリューションを持っていないように聞こえるなりますが、あなたのコードは、そうでない場合は示唆しているようです。どのようにXMLファイルを作成/操作していますか? –

+0

xmlファイルは、ソリューションとVisual Studioのフォルダに保存します。ゲームが実行されると、xmlファイルがない限り、既存のプレーヤーを作成するためにxmlファイルをチェックする必要があります。その場合、新しいデフォルトプレーヤーを作成します。 – LukeDev

+0

このディレクトリはプロジェクトのルートフォルダとの関係でどこにありますか?ルートフォルダは、.slnファイルを含むフォルダになります。 –

答えて

2

ゲームはエラーが発生したコードのtryブロックを通過したときに問題がある:

はここCreatePlayerFromXmlString()関数です。これにより、キャッチブロックに移動して代わりにデフォルトプレーヤーを作成しました。 currentHitPointsを検索するコード行の文字列のスペルが間違っています。これは、Visual StudioがXML関数に渡された文字列であるため、エラーとして表示されませんでした。

int currentHitPoints = Convert.ToInt32(playerData.SelectSingleNode("/Player/Stats/CurrentHItPoints").InnerText); 

"/Player/Stats/CurrentHItPoints"は、私は混乱している"/Player/Stats/CurrentHitPoints"

+0

文字列を入力するとき、特にプログラムエディタでスペルチェックがある場合は、スペルチェックが非常に重要です。 – LukeDev

関連する問題