我有一个负责动画一些图像的课程。我有3个玩家类,每个类都创建自己的动画类实例。每个播放器类都会向我的动画类发送一个String路径和一个String文件名数组。所以我正在做的是检查文件名的String数组是以up,down,left还是right开头。然后我将它们添加到一个缓冲图像数组中,总共4个,分别为上,下,左,右。
现在当玩家想要向左移动时,左[]将动画,同样向上移动方向等。问题是每个阵列中只存储一个图像。例如,缓冲图像的up []仅保持一个图像用于向上,而它们应该是3(每个方向有3个图像)。我无法弄明白。
以下代码取自我处理数组的Animation类。有人可以告诉我,如果我错过了什么吗?
如果这完全没有意义,我道歉:)在我脑海中听起来不错
感谢
try
{
for (String file : fileName)
{
String path = PATH + file + EXT;
for (int i = 0; i < arrayLength; i++)
{
if (file.startsWith("u"))
{
up[i] = ImageIO.read(new File(path));
}
if(file.startsWith("d"))
{
down[i] = ImageIO.read(new File(path));
}
if (file.startsWith("l"))
{
left[i] = ImageIO.read(new File(path));
}
if (file.startsWith("r"))
{
right[i] = ImageIO.read(new File(path));
}
}
}
}
catch (IOException e)
{
System.out.println("Could not load images: " + e);
}
catch (ArrayIndexOutOfBoundsException e)
{
System.out.println("Array out of bounds: " + e);
}
答案 0 :(得分:0)
这是一个非答案的答案。使用调试器在此方法中设置断点。您是否在像Eclipse这样的IDE中运行此代码?当您真正看到程序的执行流程时,导致此问题的根将更容易 - 对于任何想要真正理解某些给定代码的开发人员而言,它是一个必不可少的工具。作为旁注,我认为您的问题与arrayLength
。
答案 1 :(得分:0)
我在跟踪您的描述时遇到了一些问题,但在这里查看您的代码是我对可能存在的问题的看法。首先与你的问题无关的编码建议,你有与ifs一起测试的相互排斥的情况(file.startsWith(...)),你应该有其他的,这样当一个测试为正时,其他可以被忽略:
for (String file : fileName) {
String path = PATH + file + EXT;
for (int i = 0; i < arrayLength; i++) {
if (file.startsWith("u")) {
up[i] = ImageIO.read(new File(path));
} else if(file.startsWith("d")) {
down[i] = ImageIO.read(new File(path));
} else if (file.startsWith("l")) {
left[i] = ImageIO.read(new File(path));
} else if (file.startsWith("r")) {
right[i] = ImageIO.read(new File(path));
}
}
}
至于代码的逻辑,我看到的一个潜在问题是你的数组索引似乎没有正确链接到文件。截至目前,您的代码可以在不改变其影响的情况下进行重写:
for (String file : fileName) {
String path = PATH + file + EXT;
BufferedImage array = null;
if (file.startsWith("u")) {
array = up;
} else if(file.startsWith("d")) {
array = down;
} else if (file.startsWith("l")) {
array = left;
} else if (file.startsWith("r")) {
array = right;
}
for (int i = 0; i < arrayLength; i++) {
array[i] = ImageIO.read(new File(path));
}
}
在外部循环的每次迭代中,您只是在整个数组(或变量“arrayLength”包含的任何部分)中编写一个新的缓冲图像。因此,如果“file”每次都是相同的类型(即startsWith是相同的值),则您的数组将只包含fileName数组中的最后一项。
这是我开始猜测你的意图的地方。我假设fileName中的每个String都是一个路径,然后应该是该特定方向的动画数组中的下一个图像,所以你需要的是每个数组的单独索引:
int upArrayIndex = 0, downArrayIndex = 0,
leftArrayIndex = 0, rightArrayIndex = 0;
for (String file : fileName) {
String path = PATH + file + EXT;
if (file.startsWith("u")) {
up[upArrayIndex++] = ImageIO.read(new File(path));
} else if(file.startsWith("d")) {
down[downArrayIndex++] = ImageIO.read(new File(path));
} else if (file.startsWith("l")) {
left[leftArrayIndex++] = ImageIO.read(new File(path));
} else if (file.startsWith("r")) {
right[rightArrayIndex++] = ImageIO.read(new File(path));
}
}
我希望这是你正在问的问题的正确轨道,或者至少让你知道从哪里开始。