0

ここにこのコードがあります (lwjgl を使用していますが、それは意味がないはずです) esc キーを押したときにゲームを一時停止しようとします。キーで ArrayList を使用して、押されたものと押されていないものを追跡します。

public List<Integer> keys = new ArrayList<Integer>();

public void get() {
    if (isKeyDown(KEY_ESCAPE) && !keys.contains(KEY_ESCAPE)) {
        keys.add(KEY_ESCAPE);
        keyEscape();
    }
}

public void rem() {
    if (!isKeyDown(KEY_ESCAPE) && keys.contains(KEY_ESCAPE))
        keys.remove(KEY_ESCAPE);
}

private void keyEscape() {
    Screen.paused ^= true;
}

これはループによって呼び出され、ループ内で次から次へとこの順序で呼び出さget()rem()ます。これにより、ESC を離しjava.lang.IndexOutOfBoundsException: Index: 1, Size: 1たときに素晴らしいことがわかります。keys.remove(KEY_ESCAPE);

誰でも共有できる洞察がありますか?

4

2 に答える 2

6

KEY_ESCAPE の値は?

値が 1 の int である可能性があるため、その値のオブジェクトを削除する代わりに、明らかに存在しない位置 1 のオブジェクトを削除します。

于 2013-05-14T17:15:24.773 に答える
3

ArrayList.remove は、要素を削除するインデックスの int 引数を取ります。あなたの場合、KEY_ESCAPE もたまたま整数です。

つまり、エスケープ キーの整数値をArrayListのインデックスとして削除しようとしています。

于 2013-05-14T17:17:06.070 に答える