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/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>

それさえあれば

次のステップは、レベル エディター/ジェネレーターを作成することですが、その前に、静的文字列を使用せずにレベル フォルダーからファイルを取得できるようにする必要があります。次に、文字列操作を通じて、それをコンテンツ マネージャーに渡して、ロードするレベルを取得します (開発者またはプレイヤーによって作成されたものであるかどうかに関係なく)。

4

1 に答える 1

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;
}
于 2011-10-07T13:09:26.250 に答える