わかりました、このエラーを検索したところ、原因はおそらく Arraylist の更新が repaint() メソッドと何らかの形で競合していることであることがわかりました。コードを修正しようとして何度もコードを変更しましたが、コンパイルできないか、まったく同じエラーが発生します。私はスペースインベーダーを作成していますが、ゲームは高速で撃つまで (つまり、UP ボタンをタップして高速化するまで) 正常に動作し、このエラーが表示されます: (注:「インデックス: x、サイズ: x」の x は常に 1 とは限りません。 1 から 6 の範囲です)
Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
at java.util.ArrayList.rangeCheck(ArrayList.java:604)
at java.util.ArrayList.get(ArrayList.java:382)
at Board.checkCollisions(Board.java:185)
at Board.actionPerformed(Board.java:172)
at javax.swing.Timer.fireActionPerformed(Timer.java:312)
at javax.swing.Timer$DoPostEvent.run(Timer.java:244)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:733)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:694)
at java.awt.EventQueue$3.run(EventQueue.java:692)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:703)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
問題の原因と思われるコードの一部を次に示します。
public void actionPerformed(ActionEvent e){
if(enemies.size() == 0){
ingame = false;
}
ArrayList ss = gun.getShots();
for(int i = 0; i < ss.size(); i++){
Shot s = (Shot) ss.get(i);
if(s.isVisible()){
s.move();
}
else{
ss.remove(i);
}
}
for(int i = 0; i < enemies.size(); i++){
Enemy en = (Enemy) enemies.get(i);
if(en.isVisible()){
en.move();
}
else{
enemies.remove(i);
}
}
for(int i = 0; i < bunkers.size(); i++){
Bunker b = (Bunker) bunkers.get(i);
if(b.isVisible() == false){
bunkers.remove(i);
}
}
gun.move();
checkCollisions();
repaint();
}
public void checkCollisions(){
ArrayList ss = gun.getShots();
for(int i = 0; i < ss.size(); i++){
Shot s = (Shot) ss.get(i);
Rectangle r1 = s.getBounds();
//Collision for Enemies
for(int j = 0; j < enemies.size(); j++){
Enemy en = (Enemy) enemies.get(i);
Rectangle r2 = en.getBounds();
if(r1.intersects(r2)){
s.setVisible(false);
en.setVisible(false);
}
}
//Collision for Bunker
for(int j = 0; j < bunkers.size(); j++){
Bunker b = (Bunker) bunkers.get(i);
Rectangle r2 = b.getBounds();
if(r1.intersects(r2)){
s.setVisible(false);
b.setVisible(false);
score++;
}
}
}
}
より具体的には、これらのコード行:
checkCollisions();
Enemy en = (Enemy) enemies.get(i);
そして時折
checkCollisions();
Bunker b = (Bunker) bunkers.get(i);
また、別の問題があります。なんらかの理由で、エイリアンを撃ったり、バンカーを撃ったりすると、常に ArrayList の最初にあるものを撃たなければなりません。他の人を最初に撃っても何も起こらず、銃弾はただ通り抜けるだけです。これは私の主な関心事ではないので、私に説明するのに時間を無駄にしたくない場合は理解しています. 前もって感謝します。