File 在XNA(4.0)中查找文件

File 在XNA(4.0)中查找文件,file,xna,xna-4.0,file-location,File,Xna,Xna 4.0,File Location,我目前正在从事XNA4.0中的一个游戏项目,我们目前通过引用.txt文件(被认为是xml,但.txt工作正常)来阅读我们的关卡,我们可以将关卡作为引用文件引用。详情如下: LevelScreen.cs: private void LoadLevel() { string levelPath; // possible case switch or counter for multiple levels string level1Pa

我目前正在从事XNA4.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;
        }
        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();
        }
    }
MenuScreen.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;
        }
        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();
        }
    }
private void GenerateLevelSelectMenu()
{
列表级别=新列表();
string directory=“Content/Levels”;
//获取levelsFolder中的文件列表
foreach(Directory.GetFiles(Directory)中的字符串文件)
{
添加(文件);
}
//生成XML文件。
字符串targetDirectory=“Content/Menus/LevelSelect.xml”;
使用(StreamWriter=newstreamwriter(targetDirectory,false))
{
//需要作为xml读取
writer.WriteLine(“”);
//编写xml
writer.WriteLine(“”);
writer.WriteLine(“级别选择”);
//逐步浏览级别列表以生成数据
对于(int ii=0;ii
输出到文件(LevelSelect.xml):


水平选择
内容/级别\level1.txt
内容/级别\level1.txt
选项0
Content/Levels\level2.txt
Content/Levels\level2.txt
选择1
Content/Levels\level3.txt
Content/Levels\level3.txt
选择2
返回
背景事件
期权回购
427
240
0
但程序的行为就像文件中的所有内容一样:

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

水平选择
即使如此


下一步是创建一个级别编辑器/生成器,但在此之前,我需要能够在不使用静态字符串的情况下从级别文件夹获取文件。然后通过字符串操作将其传递给内容管理器以获取要加载的级别(无论是开发人员还是玩家创建的)

为什么不直接枚举级别目录?我错过什么了吗?也许是这样的:

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;
}
静态无效检查级别(字符串目录){
列表级别=新列表();
foreach(Directory.GetFiles(Directory,.txt)中的字符串文件){//您可以将“.txt”更改为其他文件扩展名。我一直认为我的游戏使用特殊扩展名=)很酷
添加(文件);
}
回报水平;
}

如果您知道levels文件夹的相对路径,为什么不使用DirectoryInfo.EnumerateFiles或GetFiles?这也直接处理了可执行路径。我想要一个更动态的、用户可选择的方法,我在这里看到的大部分是枚举的静态大小写切换。您使用的斜杠不正确吗
Content/Levels\level1.txt
我想的问题是,我希望玩家能够通过名称选择级别,比如打开一个文件浏览器窗口(我理解这意味着我放弃了电话传送),或者将其作为菜单传送给玩家,但我们目前从静态XML生成菜单。这种方法就像剧本一样没有选择余地,因为我们最终可能会逐步完成这个关卡(列表)。用户有机会创建自己的关卡吗?这是项目的当前目标,项目不会为他们提供文件资源管理器。这使得最终用户的操作更加复杂。相反,您应该创建某种包含资源的“级别文件”。例如,您可以显示表示标高的图标。您还可以包含其他信息属性,如级别名称、描述等。我建议使用JSON或XML存储数据。级别图标/图像可以base64编码并存储为文本。当程序读取创建的菜单时,菜单为空。我正在使用一个通用streamWriter对象来生成文件的行,我可以遍历代码,它正在编写,我甚至可以进入bin\x86\Debug\Content\菜单,物理地读取文件,但程序的行为就像文件中除了名称之外什么都没有一样。将用我所做的更新原始问题。