2017-09-24 31 views
1

我正在創建一個基本的基於文​​本的RPG,並且嘗試使用xml來保存遊戲。這是從xml調用播放器數據的代碼:如何獲取C#代碼來讀取基本遊戲中的XML文件

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。

這裏的CreatePlayerFromXmlString()函數:

 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塊就出現了錯誤。這導致它移動到catch塊並創建一個默認播放器。搜索currentHitPoints的代碼行中的字符串拼寫錯誤 - visual studio沒有將其視爲錯誤,因爲它是傳遞給XML函數的字符串。

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

"/Player/Stats/CurrentHItPoints""/Player/Stats/CurrentHitPoints"

+0

輸入字符串時,拼寫非常重要,特別是在程序編輯器中有拼寫檢查時。 – LukeDev