船と衝突したときに両方を削除しようとしています。 これを行うには、2つの高度なfor-loopを繰り返し実行しており、交差するときにそれらを削除しようとします。残念ながら、それらを反復処理しているfor-loopsを編集しているのは良い考えではなく、ConcurrentModificationExceptionをスローします。そのため、Iteratorを使用しているようです。Javaを反復処理中に配列からオブジェクトを削除する
public void collision()
{
Iterator<Ship> itShips = Ship.ships.iterator();
Iterator<Projectile> itProj = Projectile.projectiles.iterator();
while (itShips.hasNext()) {
Ship ship = itShips.next();
while (itProj.hasNext()) {
Projectile proj = itProj.next();
if (ship.c != proj.c) {
Rectangle.Float r1 = ship.getBounds();
Rectangle.Float r2 = proj.getBounds();
if (r1.intersects(r2)) {
itProj.remove();
itShips.remove();
break;
}
}
}
}
}
問題はConcurrentModificationExceptionが、私は私のアップデータを呼び出す場所に移動しているようだということです。私はイテレータのためにそれらのfor-loopsを交換しようとしましたが、動作するようには見えず、同じ例外がスローされましたが、今はupdate()メソッドにスローされます。
public void update()
{
Iterator<Ship> it1 = Ship.ships.iterator();
while (it1.hasNext()) {
Ship s = it1.next();
s.update(game);
}
Iterator<Projectile> it2 = Projectile.projectiles.iterator();
while (it2.hasNext()) {
Projectile p = it2.next();
p.update(game);
}
}
私のゲームオブジェクトの更新方法や保存方法を変更する必要がありますか?または私は間違った方法でオブジェクトの削除をしていますか?あなたは、いくつかの変数に衝突したものを保存することができます
この方法でも、私の更新方法でエラーが発生します。しかし、私はこの方法を繰り返した後、これらを削除するためにこれを使用することができるかもしれません。 – Muxor
@Muxorあなたが役に立つ答えを見つけたら、それをアップヴォートする必要があります。 – ItamarG3
同じ問題を抱えている人のために:私はこのアイデアを使用しましたが、それでもupdate()メソッドでエラーが表示されたため、少し変更する必要がありました。 collideObjectを直接削除するのではなく、配列に格納しました。私の更新メソッドでは、実際のオブジェクトが格納されている配列から、格納されているcollidedObjectsを削除するコードをいくつか入れました。 – Muxor