0

我有这段代码来创建一个 ArrayList,其中包含实际存在像素的所有像素位置(alpha!= 0)。

代码如下:

public ArrayList<Point> getPixels() {
    ArrayList<Point> output = new ArrayList<Point>();
    Image frameImage = img.getCurrentFrame();
    for (int FIx = 0; FIx <= img.getWidth(); FIx++) {
        for (int FIy = 0; FIy <= img.getHeight(); FIy++) {
            if (frameImage.getColor(FIx, FIy).getAlpha() != 0.00f) {//<-- Error
                output.add(new Point(FIx, FIy));
            }
        }
    }

    return output;
}

该循环可以多次完成,没有任何错误,但在运行的所谓随机时间,它会给出以下错误:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 32768
    at org.newdawn.slick.Image.getColor(Image.java:1248)
    at com.SourCherry.games.KittySniper.Enemy.Kitten.getPixels(Kitten.java:197)

我已经用注释标记了提到的行 (Kitten.java:197)。

如果需要其他任何东西来帮助解决这个问题,请在评论中提问。谢谢。

4

1 回答 1

2

这对我来说似乎是个问题:

for (int FIx = 0; FIx <= img.getWidth(); FIx++) {
    for (int FIy = 0; FIy <= img.getHeight(); FIy++) {

您假设它的像素范围包括 getWidthgetHeight。我强烈怀疑这些是排他的上限:

for (int FIx = 0; FIx < img.getWidth(); FIx++) {
    for (int FIy = 0; FIy < img.getHeight(); FIy++) {

因此,例如,宽度为 3 的图像应该具有有效的 X 值 0、1 和 2,而不是3。

诚然,这取决于具体是做什么org.newdawn.slick.Image的,这是我不熟悉的一门课程——但这是一个合理的起点。(很遗憾,该方法显然没有验证其输入 - 它应该抛出一个不同的异常,但这仍然是您的编程错误。)

于 2012-07-17T12:57:38.487 回答