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 値は、3ではなく0、1、2 でなければなりません。

確かに、これは正確に何をするかによって異なりますorg.newdawn.slick.Image。それは私がよく知らないクラスですが、妥当な出発点です。(明らかにそのメソッドが入力を検証しないのは残念です。別の例外をスローする必要がありますが、それでもプログラミング エラーです。)

于 2012-07-17T12:57:38.487 に答える