Как правильно? - Java
Формулировка задачи:
Есть два списки, которые пополняются и очищаются:
- пули, которые постоянно создаются и удаляются, когда вылетают за пределы екрана или когда касаются врагов;
- враги, которые создаются не в бесконечном количестве, а порциями по 5, не вылетают за пределы екрана и должны уничтожатся при прикосновении с пулей.
Такое уничтожение я пытаюсь реализовать в следующем методе. Такой метод работает и удаляет пулю и врага при их соприкосновении.
Проблема следующая:
Выбрасывает ошибку при определенном моменте, но не всегда. "Как карта ляжет".
Как мне кажеться, ошибка чаще выбрасывается при большом количестве врагов или пуль на екране.
Я новичек, потому еще не очень много понимаю
Ошибка:
public void testCllisionEnemyWithPatron() {
Iterator<Patron> patronsIterator = Patron.patrons.iterator();
while(patronsIterator.hasNext()) {
Patron p = patronsIterator.next();
Iterator<Enemy> enemiesIterator = Enemy.enemies.iterator();
while(enemiesIterator.hasNext()) {
Enemy e = enemiesIterator.next();
if(e.getRect().intersects(p.getPatronsRect())) {
patronsIterator.remove(); // сюда указывает ошибка
enemiesIterator.remove();
}
}
}
}Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException
at java.util.ArrayList$Itr.remove(Unknown Source)
at newjavapj.Background.testCllisionEnemyWithPatron(Background.java:155)
at newjavapj.Background.actionPerformed(Background.java:96)
at javax.swing.Timer.fireActionPerformed(Unknown Source)
at javax.swing.Timer$DoPostEvent.run(Unknown Source)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Решение задачи: «Как правильно?»
textual
Листинг программы
public void testCllisionEnemyWithPatron() {
ArrayList<Patron> patrons = getPatrons();
for(Patron p : patrons){
Rectangle r1 = p.getBounds();
for(Enemy e : enemies){
Rectangle r2 = e.getBounds();
if(r1.intersects(r2)){
p.setVisible(false);
e.setVisible(false);
}
}
}
}