#java #libgdx #box2d
#java #libgdx #box2d
Вопрос:
В моей игре я реализую функцию сохранения / загрузки состояния, которая восстанавливает часть мира, оставляя основное тело нетронутым.
Поэтому, когда я нажимаю кнопку загрузки, я просто сохраняю координаты актеров, затем удаляю всех актеров со сцены, а затем снова создаю сцену, используя сохраненные координаты.
Если актер владеет телом box2d, он вызывает world.DestroyBody() при удалении.
В результате игрового процесса я мог бы получить несколько актеров, ссылающихся на одно и то же тело.
Поэтому, когда я просматриваю список участников и удаляю их один за другим, возможно, что для некоторых из них принадлежащее тело уже было уничтожено (поскольку оно является общим).
Могу ли я использовать body.isActive(), чтобы проверить, было ли это тело уже уничтожено или это незаконно, поскольку тело уничтожено и никогда больше не должно разыменовываться из java?
Похоже, что body.isActive() выдает значение false после удаления body, или это какой-то побочный эффект? Прошу ли я о проблемах (например, о знаменитом случайном сбое box2d с не очень полезными сообщениями), вызывающих какие-либо функции в уже уничтоженном теле?
Могу ли я использовать такой код:
//since after ball is attached to magnet, they share
// a body, and it might be that body is already dropped
if (body.isActive()) {
body = world.destroyBody(body);
}
body = null;
Каков был бы наилучший способ организовать массовое удаление и воссоздать часть мира?
Ответ №1:
Хорошо, это отлично работало на моем рабочем столе, т. Е. Вызов body.isActive() возвращает false для уничтоженных объектов и не вызывает проблем со стабильностью.
Но при развертывании на телефоне Android вызов body.isActive() для уничтоженного тела возвращает true.
Не пытаюсь определить там правило, так как я новичок, но это выглядит так, как показано ниже:
Я бы сказал, что после уничтожения body (и оно уничтожается в машинном коде) поведение любых вызовов, которые вы выполняете по старой ссылке, не определено или приводит к немедленному / последующему сбою Box2d.
Поэтому я бы не стал выполнять какие-либо вызовы по мертвой ссылке box2d, поэтому мы не можем использовать body.isActive() после уничтожения тела.
Наилучшей практикой было бы присвоить вашей ссылке значение null сразу после того, как вы уничтожили тело. Наличие метода DestroyBody(), который уничтожает тело и всегда возвращает null, позволяет вам сделать это в одной строке:
public Body destroyBody(final Body body) {
world.destroyBody(body);
return null;
}
....
body = destroyBody(body); //destroys body and set it to null in one line