Тема игры l oop, вызывающая проблемы с ArrayList - PullRequest
0 голосов
/ 06 февраля 2020

Это мой первый вопрос по StackOverflow. Я не являюсь носителем языка Engli sh, поэтому извините за любые ошибки.

ФАКТЫ:
Я делаю 2D-игру в Android studio, используя Java. Я использую SurfaceView, абстрактный класс GameObject и ArrayList<GameObject>. Для l oop через ArrayList я в основном использую для каждого l oop - for(GameObject obj: ArrayList). В качестве игры l oop я использовал простую игру 60 кадров в секунду l oop, но мой компьютерный эмулятор мог достигать максимума только около 35 кадров в секунду.

ПРОБЛЕМЫ:
Я работал над этим для пары месяца, и теперь я решил использовать лучшую игру l oop, чтобы фиксировать скорость обновления в секунду, поэтому она будет работать с одинаковой скоростью на эмуляторе и на устройствах. Как только я пытаюсь update() чаще, чем draw(), игра начинает зависать на for(GameObject obj: ArrayList).

E / AndroidRuntime: ИСКЛЮЧИТЕЛЬНОЕ ИСКЛЮЧЕНИЕ: Thread-2
Процесс: ком. janomat.helicosquares, PID: 27202
java .util.ConcurrentModificationException
в java .util.ArrayList $ Itr.next (ArrayList. java: 860)
в com.janomat.helicosquares .GameView.update (GameView. java: 536)
at com.janomat.helicosquares.GameThread.run (GameThread. java: 155)

Долгое время go когда я учился кодировать в Java, я обнаружил, что использование for-each l oop через ArrayList может создать проблему, если мне нужно удалить obj. Поэтому я изменил для каждого l oop для classi c for(int a=1; a < ArrayList.size; a++), но затем он останавливает рендеринг объектов из списка массивов. Похоже, что объекты на экране невидимы. Я перепробовал несколько игровых циклов, даже сделал один, но все тот же.

Есть идеи, что я делаю не так?

1 Ответ

0 голосов
/ 06 февраля 2020

Скорее всего, вы удаляете элементы из списка, пока просматриваете список. Одним из возможных решений может быть сохранение элементов, которые вы хотите удалить, в другом списке. Затем вы можете удалить элементы из исходного списка, используя метод «list.removeAll (toberemovedItems)».

Или вы можете использовать метод remove () на самом итераторе. Но в этом случае вам нужно выполнить l oop с помощью итератора, а затем вы можете вызвать метод "iterator.remove ()".

Надеюсь, это поможет. Удачного кодирования!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...