2011-10-05 49 views
0

我目前的工作在XNA 4.0遊戲項目,我們目前所引用的.txt文件閱讀我們的水平(考慮XML,但.TXT正常工作)我們可以參考水平參考文件。如下:查找文件(4.0)

LevelScreen.cs:

private void LoadLevel() 
    { 
     string levelPath; 
     // possible case switch or counter for multiple levels 

     string level1Path; 
     level1Path = "GameContent\\levels\\level1.txt"; 
     string level2Path; 
     level2Path = "GameContent\\Levels\\level2.txt"; 
     string level3Path; 
     level3Path = "GameContent\\Levels\\level3.txt"; 

     //Loops to find levels 
     while (true) 
     { 
      //finds level files using game location 
      //levelPath = "Levels/level1.txt"; 
      //levelPath = Path.Combine(FullName, "Content/" + levelPath); 
      //Will be fixed to load from wherever the games file is located to find the level files. 

      //gets path of executable 
      levelPath = System.Reflection.Assembly.GetExecutingAssembly().Location; 

      if (levelPath.EndsWith("Game\\bin\\x86\\Debug\\Game.exe")) 
      { 
       //deletes end of path to set filepath to project folder 
       levelPath = levelPath.Remove(levelPath.Length - 43); 
       //increments level everytime it is loaded 
       levelNum++; 
       //keeps level within first and last 
       if (levelNum > lastLevel) 
        levelNum = 1; 
       //adds filepath for level 
       switch (levelNum) 
       { 
        case 1: 
         levelPath = string.Concat(levelPath, level1Path); 
         break; 
        case 2: 
         levelPath = string.Concat(levelPath, level2Path); 
         break; 
        case 3: 
         levelPath = string.Concat(levelPath, level3Path); 
         break; 
       //HERE we can put in a case statement to load other levels. 
        default: // currently no action (?win screen?) 
         break; 
       } 
      } 

      if (File.Exists(levelPath)) 
       break; 
     } 

MenuScreen.cs:

 private void GenerateLevelSelectMenu() 
     { 
     List<string> Levels = new List<string>(); 
     string directory = "Content/Levels"; 

     //get list of files in levelsFolder 
     foreach (string file in Directory.GetFiles(directory)) 
     { 
      Levels.Add(file); 
     } 

     //generate XML file. 
     string targetDirectory = "Content/Menus/LevelSelect.xml"; 
     using (StreamWriter writer = new StreamWriter(targetDirectory, false)) 
     { 
      //needed to be read as xml 
      writer.WriteLine("<?xml version=\"1.0\" encoding=\"utf-8\" ?>"); 

      //writing xml 
      writer.WriteLine("<Menu>"); 
      writer.WriteLine(" <MenuName>Level Select</MenuName>"); 
      //stepping through the list of Levels to generate the data 
      for (int ii = 0; ii < Levels.Count(); ii++) 
      { 
       writer.WriteLine(" <MenuItem>"); 
       writer.WriteLine(" <MenuItemText>" + Levels[ii] + "</MenuItemEvent>"); 
       writer.WriteLine(" <MenuItemEvent>" + Levels[ii] + "</MenuItemEvent>"); 
       writer.WriteLine(" <EventParams>Option" + ii + "</EventParams>"); 
       writer.WriteLine(" </MenuItem>"); 
      } 
      //needed to go to the previous menu. 
      writer.WriteLine(" <MenuItem>"); 
      writer.WriteLine(" <MenuItemText>Back</MenuItemEvent>"); 
      writer.WriteLine(" <MenuItemEvent>BackEvent</MenuItemEvent>"); 
      writer.WriteLine(" <EventParams>OptionBack</EventParams>"); 
      writer.WriteLine(" </MenuItem>"); 
      //placement of the menu itself 
      writer.WriteLine(" <PositionX>427</PositionX>"); 
      writer.WriteLine(" <PositionY>240</PositionY>"); 
      writer.WriteLine(" <SelectedItemNum>0</SelectedItemNum>"); 
      writer.WriteLine("</Menu>"); 
      writer.Close(); 
     } 
    } 

輸出到文件(LevelSelect.xml):

<?xml version="1.0" encoding="utf-8" ?> 
<Menu> 
    <MenuName>Level Select</MenuName> 
    <MenuItem> 
    <MenuItemText>Content/Levels\level1.txt</MenuItemEvent> 
    <MenuItemEvent>Content/Levels\level1.txt</MenuItemEvent> 
    <EventParams>Option0</EventParams> 
    </MenuItem> 
    <MenuItem> 
    <MenuItemText>Content/Levels\level2.txt</MenuItemEvent> 
    <MenuItemEvent>Content/Levels\level2.txt</MenuItemEvent> 
    <EventParams>Option1</EventParams> 
    </MenuItem> 
    <MenuItem> 
    <MenuItemText>Content/Levels\level3.txt</MenuItemEvent> 
    <MenuItemEvent>Content/Levels\level3.txt</MenuItemEvent> 
    <EventParams>Option2</EventParams> 
    </MenuItem> 
    <MenuItem> 
    <MenuItemText>Back</MenuItemEvent> 
    <MenuItemEvent>BackEvent</MenuItemEvent> 
    <EventParams>OptionBack</EventParams> 
    </MenuItem> 
    <PositionX>427</PositionX> 
    <PositionY>240</PositionY> 
    <SelectedItemNum>0</SelectedItemNum> 
</Menu> 

但該程序是作用像所有在文件中是這樣的:

<?xml version="1.0" encoding="utf-8" ?> 
<Menu> 
    <MenuName>Level Select</MenuName> 
</Menu> 

如果甚至

下一個步驟是創建一個關卡編輯器/生成器,但在此之前,我需要能夠從級別文件夾獲取文件,而不使用靜態字符串。然後通過字符串操作手,爲內容管理器去加載水平(無論是開發商或玩家創建)

+0

如果您知道哪個是levels文件夾的相對路徑,爲什麼不使用DirectoryInfo.EnumerateFiles或GetFiles?這也直接處理可執行路徑。 – Elideb

+0

我想要一個更動態的,用戶可選擇的方法,我所看到的大部分情況是通過枚舉進行靜態切換。 – gardian06

+0

你不使用不正確的斜槓嗎? '內容/色階\ level1.txt' – FreeAsInBeer

回答

0

爲什麼不枚舉級目錄?我錯過了什麼嗎?也許類似於:

static void CheckLevels(string directory) { 
    List<string> levels = new List<string>(); 

    foreach (string file in Directory.GetFiles(directory, ".txt")) { // You could change ".txt" to some other file extension. I always think it's cool for my games to use special extensions =) 
     levels.Add(file); 
    } 

    return levels; 
} 
+0

,我想的問題是,我希望玩家能夠選擇通過名稱的級別,如打開一個文件瀏覽器窗口(我的理解這意味着我放棄了電話傳送),或者將其作爲菜單傳送給播放器,但我們目前使用靜態XML生成菜單。並且這種方法的接縫像劇本沒有選擇,因爲我們可能會逐步通過這個關卡(列表)。 – gardian06

+0

用戶是否有機會創建自己的關卡? – FreeAsInBeer

+0

的Project – gardian06