XNA C#.txt文件平铺引擎

时间:2014-05-27 15:51:38

标签: c# xna

在XNA中使用.txt文件时我不是很有经验,因此我需要一些帮助。

我想让Tile Engine读取并根据.txt文档中的数字放置信息。它看起来像这样:

1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 etc

现在,这个文件在X中包含50个字符(25个没有[,])并且在Y中有15行。问题是它只读取Y中的第一行而不是Y中的其余14个,这是导致它崩溃。

以下是代码:

public void LoadMap(string MapName)
    {

        using (StreamReader streamReader = new StreamReader("Content/" + MapName + ".txt"))
        {

            do
            {
                string line = streamReader.ReadLine();

                string[] numbers = line.Split(',');

                int temp = 0;

                    for (int y = 0; y < loopY; y++)
                    {
                        for (int x = 0; x < loopX; x++)
                        {

                            Blocks[y, x] = new Block();

                            //Crashes here when temp reaches 25
                            if (int.Parse(numbers[temp]) == 1)
                                Blocks[y, x].color = Color.Blue;

                            else if (int.Parse(numbers[temp]) == 2)
                                Blocks[y, x].color = Color.Violet;

                            else
                                Blocks[y, x].color = Color.White;

                            temp++;
                        }

                    }

            } while (!streamReader.EndOfStream);


        }

    }

2 个答案:

答案 0 :(得分:2)

根据您对我的问题的回复:

  

“索引超出了数组的范围。”是的我检查了它loopX是25而Numbers是25

numbers[]为零索引,因此上限为numbers[24]。如果loopX为25,那么,是的,您会看到异常。

您正在遍历loopX,然后每次循环并递增temp。您需要在每次loopX迭代后将temp设置回0,或者只使用numbers数组而不是循环值。

我建议您更改循环以使用numbers代替:

for (int x = 0; x < numbers.Length; x++)

然后,要使用现有代码,请使用以下方法检查值:

if (int.Parse(numbers[x]) == 1)
编辑:这就是我试图解释的内容:

using (StreamReader streamReader = new StreamReader("Content/" + MapName + ".txt"))
{
    int y = 0;

    do
    {
        string line = streamReader.ReadLine();

        string[] numbers = line.Split(',');

        for (int x = 0; x < numbers.Length; x++)
        {
            Blocks[y, x] = new Block();

            if (int.Parse(numbers[x]) == 1)
                Blocks[y, x].color = Color.Blue;

            else if (int.Parse(numbers[x]) == 2)
                Blocks[y, x].color = Color.Violet;

            else
                Blocks[y, x].color = Color.White;
         }

           y++;

        } while (!streamReader.EndOfStream);


    }

答案 1 :(得分:2)

我在您的代码中看到以下内容,至少可以说是可疑的:

  1. 如果你的temp&gt; = numbers.Length,那么你将获得“Index超出数组的范围”。

  2. 如果在阅读第一行后发生这种情况,当然你不会再读取任何行了,因为你有一个例外而且会中断。

  3. 你用每一个新行覆盖你的块:如果你读第一行并进入x和y循环,在x和y的第一次迭代中,它们都将为0.所以你写{ {1}}。读完下一行后,再次进入x和y循环。它们以0开始,因此在处理第二行时,在第一次迭代x和y时,您将编写Blocks[0,0] = new Block()。实际上,在处理第一行时,会覆盖您之前在索引[0,0]上写入的块。 x和y的所有其他组合也存在同样的问题。

  4. 调试,逐步调试和观察变量。这将有助于您了解正在发生的事情。