Я работаю над игровым проектом. Пока все хорошо, но я просто застрял на основной вещи, и я не могу найти решение и заставить его работать правильно. Я решил приехать сюда и попросить у вас предложений.удаленно удалите предмет из arraylist после пересечения
ПРОБЛЕМА:
Когда игрок приходит в контакт с бриллиантом, я полагаю, чтобы удалить алмаз от уровня и от ArrayList, содержащий все объекты в мире. Что всегда происходит, я получаю сообщение об ошибке исключения после вызова метода remove().
КОДЫ: 1.Class со списком: EDIT_1
private ArrayList<AbstractObject> objects = new ArrayList<AbstractObject>();
public void removeObject(String name){
ArrayList<AbstractObject> newest = new ArrayList<AbstractObject>();
ListIterator<AbstractObject> delete=objects.listIterator();
while(delete.hasNext()){
if(name.equals(delete.next().getName())){
delete.remove();
}
else{
delete.previous();
newest.add(delete.next());
}
}
objects=newest;
}
2.Player класс вызов метода removeObject: EDIT_1
public void playerLogic(){
fallingDown();
for(AbstractObject object : this.getWorld().getListOfObjects()){ <--------ERROR HERE
if(this.intersects(object)){
if(object instanceof FinishZone && points>=getWorld().getDiamondCount()){
if(!(getWorld().getManager().isMoreLevels())){
getWorld().getMenu().openMenu(true);
}
else{
this.getWorld().getManager().nextLevel();
}
}
if(object instanceof Diamond){
points++;
this.getWorld().removeObject(object.getName());
}
}
}
}
ОШИБКА:
Exception in thread "Thread-2" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859)
at java.util.ArrayList$Itr.next(ArrayList.java:831)
at project.objects.characters.Player.playerLogic(Player.java:77)
at project.objects.characters.Player.update(Player.java:70)
at project.world.World.update(World.java:110)
at project.Main.update(Main.java:122)
at project.Main.run(Main.java:65)
at java.lang.Thread.run(Thread.java:745)
Я проверил некоторые примеры удаления элементов из arraylist, но я havent найти разницу.
EDIT_1: Итак, я понял, как это сделать, но я всегда получаю сообщение об ошибке. Я отредактировал блок кода removeobject. Это сработало хорошо с нейтральным списком, который я создал для тестирования. Я помещаю все элементы, которые я не хочу удалять в новый список, чем оформил старый arraylist с новейшим. Он работал без ошибки исключения. Когда я сделал то же самое с игровым списком, который я хочу отредактировать, он выдал ту же ошибку. Ill положить туда рендер код тоже, если возможно, есть проблема ...
public void render(Graphics g) {
if(menu.getChoice()==-1){
menu.render(g);
}
else if(menu.getChoice()==0){
g.setColor(Color.white);
for(AbstractObject tempObj : objects){
tempObj.render(g);
}
}
}
ИСПРАВЛЕНО: Ill изменил исходный список ListIterator вместо того, чтобы элементы в ArrayList перед добавлением его в ListIterator. Все методы изменились на итерацию. Работает отлично :)
Ничего себе. Я не знаю об этом вспомогательном списке. Мне нравится эта идея. Я попробую это. – parohy