#file #xna #xna-4.0 #file-location
#файл #xna #xna-4.0 #расположение файлов
Вопрос:
В настоящее время я работаю над игровым проектом в XNA 4.0, в котором мы в настоящее время считываем наши уровни, ссылаясь на файлы .txt (считается xml, но .txt работает нормально), мы можем ссылаться на уровни как на файлы, на которые ссылаются. следующим образом:
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/Levelslevel1.txt</MenuItemEvent>
<MenuItemEvent>Content/Levelslevel1.txt</MenuItemEvent>
<EventParams>Option0</EventParams>
</MenuItem>
<MenuItem>
<MenuItemText>Content/Levelslevel2.txt</MenuItemEvent>
<MenuItemEvent>Content/Levelslevel2.txt</MenuItemEvent>
<EventParams>Option1</EventParams>
</MenuItem>
<MenuItem>
<MenuItemText>Content/Levelslevel3.txt</MenuItemEvent>
<MenuItemEvent>Content/Levelslevel3.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>
если даже это
следующим шагом будет создание редактора / генератора уровней, но перед этим мне нужно иметь возможность получать файлы из папки уровня без использования статических строк. затем с помощью манипуляций со строками передайте это менеджеру контента, чтобы получить загружаемый уровень (будь то созданный разработчиком или игроком)
Комментарии:
1. Если вы знаете, какой относительный путь к папке levels, почему бы не использовать DirectoryInfo.EnumerateFiles или GetFiles? Это также напрямую влияет на путь к исполняемому файлу.
2. Я хотел бы более динамичный, выбираемый пользователем подход, и то, что я вижу в этом, — это в основном статическое переключение регистра путем перечисления.
3. Разве вы не используете неправильные косые черты?
<MenuItemText>Content/Levelslevel1.txt</MenuItemEvent>
Ответ №1:
Почему бы просто не перечислить каталог уровня? Я что-то упустил? Возможно, что-то вроде:
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;
}
Комментарии:
1. проблема, о которой я думаю, заключается в том, что я хочу, чтобы проигрыватель мог выбирать уровень по имени, например, открывать окно проводника файлов (я понимаю, что это означает, что я прекращаю доставку по телефону) или доставлять его проигрывателю в виде меню, но в настоящее время мы создаем наши меню из статическихXML. и этот подход выглядит так, как будто у игры нет выбора, поскольку мы, вероятно, в конечном итоге пройдем через эти уровни (список).
2. Есть ли у пользователя возможность создавать свои собственные уровни?
3. это текущая цель проекта
4. Я бы не стал представлять их в проводнике файлов. Это значительно усложняет задачу для конечного пользователя. Вместо этого вы должны создать какой-то «файл уровня», который включает ресурсы. Например, можно отобразить значок, представляющий уровень. Вы также можете включить другие атрибуты для получения информации, такой как имя уровня, описание и т.д. Я бы рекомендовал использовать JSON или XML для хранения данных. Значок уровня / изображение может быть закодировано в base64 и сохранено в виде текста.
5. Я реализовал это, хотя столкнулся с другой проблемой. когда программа переходит к чтению созданного меню, меню остается пустым. Я использую универсальный объект StreamWriter для генерации строк файла, и я могу просматривать код, который он пишет, и я даже могу зайти в bin x86 Debug Content Menus и физически прочитать файл, но программа ведет себя так, как будто в файле ничего нет.файл, но имя. обновит исходный вопрос тем, что я сделал.