2011-04-05 54 views
0

我有一个类负责动画的一些图像。我有3个玩家类,每个类都创建自己的这个动画类的实例。每个玩家类都向我的动画类发送一个String路径和一个String数组文件名。因此,我要做的是检查文件名的字符串数组是以向上,向下,向左还是向右开始。然后,我将它们添加到一组缓冲的图像中,总共4个,分别命名为上,下,左和右。字符串数组迭代和startsWith()

现在,当玩家想要向左移动时,左边的[]会生成动画,向上的方向也是如此。问题是每个数组中只有一个图像被存储。例如,缓冲图像的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

我在描述后遇到了一些麻烦,但在这里查看您的代码是我的想法,可能是您的问题。首先与你的问题无关的编码建议,你有与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数组中的最后一项。

这里是我将开始猜测你的意图的地方。我认为,在名的每个字符串,则应该是动画的特定方向的阵列中,然后在下一个图像中的一个路径,所以你需要的是一个单独的索引到每个阵列:

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

我希望这对于你所问的问题来说,这是正确的方向,或者至少让你知道从哪里开始。

+0

是的,在netbeans通过dubugger后,我发现每个数组都被填充相同的图像。我想保持Animation类尽可能通用,以便传递给它的任何数组,上,下,左,右图像将被放入相应的数组中,并相应地进行动画处理。感谢回复,它的帮助很大。我想我知道如何处理这个现在:) – 2011-04-05 19:28:59

0

这里有一个非答案的答案听起来不错。使用调试器在此方法中设置断点。您是否在像Eclipse这样的IDE中运行此代码?当你真正看到你程序的执行流程时,造成这个问题的根源会容易得多 - 它对于任何想要真正理解某些给定代码的开发者来说都是一个必不可少的工具。作为一个方面说明,我认为你的问题与arrayLength有关。

+0

我正在使用NetBeans,目前正在使用dubugger。它看起来像是用第一张图片填充阵列,然后是第二张,最后是第三张。因此,我似乎最终与阵列充满了相同的图像..hmmmmm – 2011-04-05 19:10:32