Я создал выстрел пули:
for (Bullet bullet : bullets) {
bullet.x = bullet.x + 10;
System.out.println(bullet.x);
batch.draw(tbullet, bullet.x, bullet.y);
}
Как удалить объект(пулю), когда она вылетает за экран?
Дополнение:
for (Bullet bullet : bullets) {
bullet.x = bullet.x + 10;
System.out.println(bullet.x);
batch.draw(tbullet, bullet.x, bullet.y);
if (bullet.x>=500) {
tbullet.dispose();// Картинка Освобождаеться
bullets.remove(bullet);// Вызывает ошибку
}
}
Exception in thread "LWJGL Application" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859)
at java.util.ArrayList$Itr.next(ArrayList.java:831)
at com.mygdx.game.MyGdxGame.render(MyGdxGame.java:265)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:223)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:124)
Ответ
Java - язык с автоматическим управлением памятью. Поэтому явно вручную освободить память, выделенную для объекта, нельзя.
Вы можете удалить объект из коллекции bullets
bullets.remove(bullet);
и тогда, если на него не осталось других ссылок, сборщик мусора когда-нибудь почистит его.
Если пуль много, и они появляются и исчезают очень часто, вы можете захотеть держать конечное количество пуль всегда в памяти в некотором пуле (коллекции) и добавить им поле boolean active. После этого вместо создания новой пули - брать из пула любую неактивную пулю и выставлять ей active = true. Когда пуля должна быть удалена - сбрасывать поле active в false
Комментариев нет:
Отправить комментарий