Как правильно удалять body в box2d из world, чтоб не вылетало

207
30 ноября 2017, 01:40

Написал игру на движке 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);

READ ALSO
Java открытие приложения от файла

Java открытие приложения от файла

Есть Desktop на JavaЯ сохраняю данные в файл через JChooser, и через него же открываю

164
Swap нод в SinglyLinkedList

Swap нод в SinglyLinkedList

Есть SinglyLinkedListНужно поменять местами nodes, причем именно перелинковать их(поменять ссылки), а не просто изменить содержимое

223
Проблемы с событием hidden.bs.modal Bootstrap

Проблемы с событием hidden.bs.modal Bootstrap

В модальном окне "Вход" (Bootstrap) имеются две ссылки "Войти" и "Регистрация"При клике на которых появляется соответствующее модальное окно

289