【问题标题】:XNA C# .txt file Tile EngineXNA C# .txt 文件平铺引擎
【发布时间】:2014-05-28 00:30:31
【问题描述】:

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

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

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);


        }

    }

【问题讨论】:

  • loopY和loopX在哪里定义?
  • 你确定 loopX 在numbers[] 的范围内吗?您看到的异常是什么?
  • 它们在我发布的代码上方定义,它们看起来像这样: int loopX = GameScreen.Screen.X / 32; int loopY = GameScreen.Screen.Y / 32; Screen.X 是 800:Screen.Y 是 500,我将它们除以 32 以获得覆盖屏幕所需的块数。
  • "索引超出了数组的范围。"是的,我检查了它 loopX 是 25,Numbers 是 25。
  • 1.访问 numbers[temp] 是不安全的,因为 temp 可能大于数组长度。 2. 您正在为每一行覆盖 Blocks[y,x]。

标签: c# xna


【解决方案1】:

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

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

numbers[] 是零索引的,所以上限是numbers[24]。如果loopX 是 25,那么,是的,你会看到一个异常。

您正在遍历 loopX 然后 loopY 并每次递增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);


    }

【讨论】:

  • 我实际上让它不会通过这样做而崩溃: if (temp == 25) { temp = 0;但我的问题仍然存在,即它只读取 .txt 文档中的第一行,而不是 Y 中的其他 14 行。
  • 每次迭代 Do 循环时,您都在读取一行。您可以使用 temp 变量来解决这个问题。稍后我将再次编辑我的答案。
  • @Iskalder 我在我的编辑中加入了。它没有经过测试,并且可能由于拼写错误而出现错误,但我认为它明白了这一点。
  • 嗨!是的,现在我明白你的意思了,它实际上工作得很好!我没有考虑在 for 循环中使用“数字”,非常聪明;)谢谢顺便说一句!
【解决方案2】:

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

  1. 如果您的 temp >= numbers.Length,那么您将得到“索引超出数组范围”。

  2. 如果在阅读第一行之后发生这种情况,当然您不会再阅读任何其他行,因为您遇到了异常并且它会中断。

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

调试、单步执行和观察变量。这将帮助您了解正在发生的事情。

【讨论】:

  • 嗨!感谢您的回复,您的解释似乎很合乎逻辑,但是我进行了调试,每次到达 loopY 时它都会重置 X 但 Y 保持不变。所以它就像这样 Blocks[0,0] - 循环通过 X 直到 25 然后它循环通过 Y Blocks[1,0] Blocks[2,0] 等
  • 当您处理下一行时,Blocks[0,0] 会发生什么?确保你明白,你的代码和比尔的代码有什么区别。否则,除了让这种微小的代码工作平静之外,您并没有取得太多成就:)
  • 是的,它在循环 Y 完成后重置了 Y。确实,它确实重置了块。抱歉直到我调试了 Y 中的所有循环才看到它,这需要一段时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-27
  • 2022-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多