在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);
}
}
答案 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)
我在您的代码中看到以下内容,至少可以说是可疑的:
如果你的temp&gt; = numbers.Length,那么你将获得“Index超出数组的范围”。
如果在阅读第一行后发生这种情况,当然你不会再读取任何行了,因为你有一个例外而且会中断。
你用每一个新行覆盖你的块:如果你读第一行并进入x和y循环,在x和y的第一次迭代中,它们都将为0.所以你写{ {1}}。读完下一行后,再次进入x和y循环。它们以0开始,因此在处理第二行时,在第一次迭代x和y时,您将编写Blocks[0,0] = new Block()
。实际上,在处理第一行时,会覆盖您之前在索引[0,0]上写入的块。 x和y的所有其他组合也存在同样的问题。
调试,逐步调试和观察变量。这将有助于您了解正在发生的事情。