현재 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>
은 심지어
경우 다음 단계는 레벨 에디터/발전기를 만드는 것입니다,하지만 그 전에 내가 정적 문자열을 사용하지 않고 레벨 폴더에서 파일을 얻을 수 있어야합니다. 그 다음 스트링 조작을 통해 콘텐츠 관리자에게로드 할 레벨을 얻는다. (개발자 나 생성자 모두)
레벨 폴더에 대한 상대 경로를 알고 있다면 DirectoryInfo.EnumerateFiles 또는 GetFiles를 사용하지 않는 이유는 무엇입니까? 그것은 실행 파일 경로도 직접 처리합니다. – Elideb
나는보다 동적 인 사용자 선택 가능한 접근법을 원합니다. 그리고 이것에 관해서는 정적으로 대문자 전환을 열거하고 있습니다. – gardian06
잘못된 슬래시를 사용하고 있지 않습니까? 'MenuItemText> Content/Levels \ level1.txt MenuItemEvent>' – FreeAsInBeer