2011-10-05 5 views
0

현재 XNA 4.0의 게임 프로젝트에서 현재 참조하고있는 .txt 파일 (xml이지만 .txt는 잘 동작 함)을 참조하여 레벨을 읽었으며 참조 된 레벨을 참조 할 수 있습니다. 파일.XNA (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

레벨 폴더에 대한 상대 경로를 알고 있다면 DirectoryInfo.EnumerateFiles 또는 GetFiles를 사용하지 않는 이유는 무엇입니까? 그것은 실행 파일 경로도 직접 처리합니다. – Elideb

+0

나는보다 동적 인 사용자 선택 가능한 접근법을 원합니다. 그리고 이것에 관해서는 정적으로 대문자 전환을 열거하고 있습니다. – gardian06

+0

잘못된 슬래시를 사용하고 있지 않습니까? 'MenuItemText> Content/Levels \ 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

프로젝트의 현재 목표는 – gardian06