0

Tile クラスの配列を使用して情報を格納する Tilemap エンジンを作成しようとしています。これらの Tile クラスは、テクスチャ インデックスとアーティファクト インデックスを含む 8 つの情報 (すべて数値) を格納しますが、これらの配列の保存と読み込みに関しては、特に読み込みに数分かかる場合がある読み込みに時間がかかる場合があります。 100x100 などのはるかに大きなサイズの配列。現在、テキスト ファイルを使用して情報を保存し、さまざまなタイルをスペースで区切り、それらのタイルのさまざまな情報をカンマで区切り、StreamReaders と StreamWriters を使用してこれらを読み取ります。

    public void Load()
    {
        try
        {
            TextReader TR = new StreamReader("C:/Users/Cogythea/Documents/Programming TextFiles/TileMap.tilemap");
            TR.Close();


            StreamReader reader = new StreamReader("C:/Users/Cogythea/Documents/Programming TextFiles/TileMap.tilemap");
            List<string[]> stringLists = new List<string[]>();

            int arrayArea;

            int lineLength = 0;
            int arrayHeight = 0;

            int width;

            string line;
            while ((line = reader.ReadLine()) != null)
            {
                lineLength = line.Length;
                arrayHeight++;

                stringLists.Add(line.Split(' '));
            }

            arrayArea = lineLength * arrayHeight;




            for (int y = 0; y < lineLength; y++)
            {
                for (int x = 0; x < arrayHeight; x++)
                {
                    try
                    {
                        string currentLine = stringLists[x][y].ToString();

                        List<string[]> currentLineSections = new List<string[]>();
                        currentLineSections.Add(currentLine.Split(','));

                        Map[x, y].textureIndex = Convert.ToInt16(currentLineSections[0][0].ToString());
                        Map[x, y].accessoryIndex = Convert.ToInt16(currentLineSections[0][1].ToString());


                        if (currentLineSections[0][2].ToString() == "1")
                            Map[x, y].colliding = true;
                        else
                            Map[x, y].colliding = false;


                        if (currentLineSections[0][3].ToString() == "1")
                            Map[x, y].startLocation = true;
                        else
                            Map[x, y].startLocation = false;


                        if (currentLineSections[0][4].ToString() == "1")
                            Map[x, y].portal = true;
                        else
                            Map[x, y].portal = false;



                        if (currentLineSections[0][5].ToString() == "1")
                            Map[x, y].portalExit = true;
                        else
                            Map[x, y].portalExit = false;


                        Map[x, y].portalNumber = Convert.ToInt16(currentLineSections[0][6].ToString());

                        Map[x, y].portalDestination = new Vector2(Convert.ToInt16(currentLineSections[0][7].ToString()), Convert.ToInt16(currentLineSections[0][8].ToString()));

                    }
                    catch (Exception e)
                    {

                    }
                }
            }



            reader.Close();
        }

        catch (Exception)
        {
        }
    }

    public void Save()
    {
        try
        {
            TextReader TR = new StreamReader("C:/Users/Cogythea/Documents/Programming TextFiles/TileMap.tilemap");
            TR.Close();
        }

        catch (Exception)
        {
            FileStream create = File.Create("C:/Users/Cogythea/Documents/Programming TextFiles/TileMap.tilemap");
            create.Close();
        }


        StreamWriter writer = new StreamWriter("C:/Users/Cogythea/Documents/Programming TextFiles/TileMap.tilemap");
        for(int x = 0; x < Map.GetLength(0); x++)
        {
            for (int y = 0; y < Map.GetLength(1); y++)
            {
                writer.Write(Map[x, y].textureIndex.ToString() + ",");
                writer.Write(Map[x, y].accessoryIndex.ToString() + ",");

                if(Map[x,y].colliding)
                    writer.Write("1,");
                else
                    writer.Write("0,");

                if (Map[x, y].startLocation)
                    writer.Write("1,");
                else
                    writer.Write("0,");


                if (Map[x, y].portal)
                    writer.Write("1,");
                else
                    writer.Write("0,");


                if (Map[x, y].portalExit)
                    writer.Write("1,");
                else
                    writer.Write("0,");

                writer.Write(Map[x, y].portalNumber.ToString() + ",");

                writer.Write(Map[x, y].portalDestination.X.ToString() + ",");
                writer.Write(Map[x, y].portalDestination.Y.ToString() + ",");

                writer.Write(" ");
            }
            writer.WriteLine();
        }
        writer.Close();
    }

これに代わる方法をインターネットで探していたところ、情報を格納するための XML ファイルが圧倒的にサポートされていることがわかりました。さて、これについて2つ質問があります。1 つ目は、私がコードに使用しているチュートリアル ( http://msdn.microsoft.com/en-us/library/bb203924.aspx ) では、IAsyncResult に StorageDevice を使用するように指示されていますが、それを宣言すると Visual Studio がもたらします。 2つの問題のうちの1つ:初期化しないと、存在しないと表示されますが(ご想像のとおり)、初期化すると-

    StorageDevice device = new StorageDevice();

「型 'Microsoft.Xna.Framework.Storage.StorageDevice' にはコンストラクターが定義されていません」というエラーが表示されますが、括弧内に必要なものがあることはわかりません。これを機能させるにはどうすればよいですか? これについての助けは大歓迎です。私の2番目の質問は、これに代わるものがあるかどうか、または私の元の方法は正しかったが改善が必要であったかどうかです. 空き時間に 2 週間オン/オフでこの問題を解決しようとしてきたので、何か助けていただければ幸いです。ありがとう。

4

1 に答える 1

0

タイルマップの場合、XML ストレージは使用しません。基本的に2Dである何かの周りの「制御構文」が多すぎます。

各行がマップ内の行である単純なテキスト ファイルは、より論理的であるか、バイナリ ファイルの方が優れているように見えます。

しかし、読みやすく維持しやすいように、XML ファイルを読み取り、それらを独自のバイナリ形式に解析し、バイナリ出力を独自のタイル/マップ形式として保存する「パーサー」を作成できます。

次に、この解析/圧縮された形式を読み取ることができる「マップ/タイルローダー」が必要です。

=保守性と速度の両方。

ほとんどの言語と同じです。「人間が読める言語」で記述し、「アセンブラー/バイナリオペコード」にコンパイルします。

于 2014-03-29T00:36:33.233 に答える