Написал игру на движке libgdx, с использованием box2d для коллизии. Для пуль использовал Body bullet
, что бы обрабатывать коллизию и урон. Как лучше удалять пули после какого-то времени или коллизии что бы не вылетало
java: /var/lib/hudson/jobs/libgdx/workspace/trunk/gdx/jni/Box2D/Dynamics/b2World.cpp:134: void b2World::DestroyBody(b2Body*): Assertion 'IsLocked() == false' failed.
Удаления я делал так:
if(bullet.isCollision()){
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
if (!world.isLocked()) {
world.destroyBody(bulletBody);
Thread.currentThread().interrupt();
break;
}
}
}
}).start();
}
Помимо того что это не работает и ошибка все равно вылетает, если ещё куча минусов. Например, если делать это для автомата, то будет создаваться очень много потоков, что приводит не только к большому потреблению памяти, но и выбрасывается StackOverflow из-за огромного их количества.
Я попробовал решить эту проблему, добавляя каждую пуля в ArrayList
и очищаю в 1 потоке этот список.
@Override
public void run() {
while (true) {
for (int i = 0; i < MchAmmunition.destroyList.size(); i++) {
if (!world.isLocked()) {
world.destroyBody(MchAmmunition.destroyList.get(i));
MchAmmunition.destroyList.remove(i);
} else i--;
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Вроде проблема с множеством потоков решена, но ошибка все равно возникает. Что я делаю неправильно?
UPD: ещё 1 ошибка, тоже из-за автомата вылетает
Exception in thread "Thread-13" java.lang.StackOverflowError
В этом месте world.step(1 / 60f, 4, 4);
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Есть Desktop на JavaЯ сохраняю данные в файл через JChooser, и через него же открываю
Есть SinglyLinkedListНужно поменять местами nodes, причем именно перелинковать их(поменять ссылки), а не просто изменить содержимое
В модальном окне "Вход" (Bootstrap) имеются две ссылки "Войти" и "Регистрация"При клике на которых появляется соответствующее модальное окно