В качестве предисловия я искал форумы, но ничего не нашел в связи с моей конкретной ситуацией. Я только начал изучать Java около недели назад, и это мой первый набег на объектно-ориентированное программирование.Удаление элементов из ArrayList при столкновении (Java)?
Я строю основную игру (думаю, что это как космические захватчики, когда дело доходит до механики). У меня есть класс «Projectile», класс «FallingThings» (который является родительским классом для классов, которые у меня есть для объектов, падающих («Деньги, друг, враг»)). Каждый выстреливаемый снаряд хранится в ArrayList и как каждый экземпляр Money, Friend и Enemy (каждый в своем собственном ArrayList).
Проблема возникает, когда я реализую обнаружение столкновения. Во-первых, для создания механизма столкновения требуется несколько пулей (я думаю, что я мог бы просто испортить некоторые цифры здесь, но я не уверен на 100%). Теперь, иногда после того, как я запускаю несколько пуль (и они давно ушли), обнаружено столкновение без того, что я запускаю еще одну пулю, и объект FallingThings исчезает с экрана. Кроме того, в другое время сразу исчезают сразу несколько объектов. Самое странное, что все это непоследовательно и не всегда воспроизводимо одинаково. Однако мои столкновения с персонажем игрока отлично работают.
У кого-нибудь есть идеи относительно того, как я могу это исправить? Мой код ниже:
Метод в классе «FallingThings» (в ArrayList определены в ClassClass (основной класс)).
public void checkBulletCollision(Rectangle rectangle) {
for (int j = 0; j < Character.getProjectiles().size(); j++) {
Projectile p = (Projectile) Character.getProjectiles().get(j);
if (p.isVisible() == true) {
for (int i = 0; i < StartingClass.getMoneys().size(); i++) {
Money m = (Money) StartingClass.getMoneys().get(i);
if (m.getR().intersects(rectangle)) {
m.remove(i);
System.out.println("bullet collision");
}
}
for (int i = 0; i < StartingClass.getEnemies().size(); i++) {
Enemy e = (Enemy) StartingClass.getEnemies().get(i);
if (e.getR().intersects(rectangle)) {
e.remove(i);
}
}
for (int i = 0; i < StartingClass.getFriends().size(); i++) {
Friend f = (Friend) StartingClass.getFriends().get(i);
if (f.getR().intersects(rectangle)) {
f.remove(i);
}
}
}
}
}
Мой метод обновления для снарядами:
public void update() {
y -= speedY;
if (y < 0) {
visible = false;
}
rectangle.setBounds(getRectangle());
}
Я пытался исправить это в течение всего дня, и до сих пор не может получить надлежащую реализацию. Я попытался использовать ListIterator, но это вызвало замораживание программы и возникшую ошибку приведения типов.
Большое вам спасибо за помощь! =)
Одна вещь, которую нужно учитывать, когда вам нужно перебирать список и удалять элементы в нем, убедитесь, что вы итерации спускаетесь с List.size() до 0. funky things происходят, когда вы удаляете элемент из списка во время цикла через него в порядке возрастания. – jmcg
Я бы использовал фактический Итератор, у которого есть метод remove(). Не нужно даже думать об индексах в этом случае. – slipperyseal
Может ли ваша пуля поразить более одного предмета за раз? Или вы ожидаете, что он просто удалит только первый элемент? Если это так, вам нужно вырваться из циклов, чтобы избежать удаления нескольких элементов. –