Как изменить массу тела в libGDX? Я делаю так, чтобы по нажатию на экран некоторое тело разделялось на два тела. По нажатию на экран вызывается некоторая функция divide(), в которой я произвожу необходимые мне манипуляции с частицами, в том числе изменение массы, которое выглядит следующим образом:...
MassData newMassData=new MassData();
newMassData.mass=this.body.getMass()-mass;// mass-это масса второго тела, которое отделяется от главного
this.body.setMassData(newMassData);
...
В строчке this.body.setMassData(newMassData);ИНОГДА происходит ошибка из-за которой происходит завершение работы Java Platform SE binary. В логах пишется следующее: This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
Assertion failed!
Program: C:\Program Files\Java\jdk1.8.0_05\bin\java.exe
File: /var/lib/jenkins/workspace/libgdx/extensions/gdx-box2d/gdx-box2d/jni/Box2D/Dynamics/b2Body.cpp, Line 355
Expression: m_world->IsLocked() == false
Было бы интересно хотя бы узнать, что это обозначает и почему приложение падает иногда. А самое главное, хотелось бы узнать, как грамотно реализовать разделение тела на две части и изменение массы тела.
P.S. Приложение падает именно в этой строчке и никак иначе, т.к. приложение может упасть только при наличии этой строчки кода.

21 Авг 2019 в 06:18
171 +1
0
Ответы
1

Ошибка "Assertion failed!" может возникать из-за нарушения некоторых инвариантов внутри библиотеки Box2D, когда вы пытаетесь изменить свойства тела в момент, когда мир физики заблокирован для изменений.

Вместо того, чтобы изменять массу тела напрямую, вам следует использовать функцию ApplyForce(), чтобы применить силу к телу и тем самым изменить его движение и динамику. Вы можете также создать новые тела с разными массами и связать их силами или джойнтами.

Примерно так:

// Создание новых тел с разными массами
BodyDef bodyDef1 = new BodyDef();
bodyDef1.type = BodyDef.BodyType.DynamicBody;
Body body1 = world.createBody(bodyDef1);
FixtureDef fixtureDef1 = new FixtureDef();
fixtureDef1.shape = new PolygonShape();
fixtureDef1.density = 1.0f; // Масса первого тела
body1.createFixture(fixtureDef1);
BodyDef bodyDef2 = new BodyDef();
bodyDef2.type = BodyDef.BodyType.DynamicBody;
Body body2 = world.createBody(bodyDef2);
FixtureDef fixtureDef2 = new FixtureDef();
fixtureDef2.shape = new PolygonShape();
fixtureDef2.density = 0.5f; // Масса второго тела
body2.createFixture(fixtureDef2);
// Применение силы к телам
float force = 100f;
Vector2 forceVector = new Vector2(force, force);
body1.applyForceToCenter(forceVector, true);
body2.applyForceToCenter(forceVector, true);

Это лишь общий пример, ваша реализация может отличаться в зависимости от вашей конкретной ситуации. Но важно помнить, что важно изменять свойства тел в правильный момент и обеспечивать стабильность работы физического мира.

20 Апр в 13:20
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 84 654 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир