В box2d я могу вызвать body.isActive () после уничтожения тела? - PullRequest
0 голосов
/ 04 апреля 2019

В моей игре я реализую функциональность состояния сохранения / загрузки, которая восстанавливает часть мира, оставляя наземное тело нетронутым.

Поэтому, когда я нажимаю кнопку загрузки, я просто сохраняю координаты актеров, затем удаляю всех актеров со сцены и затем заново создаю сцену, используя сохраненные координаты.

Если у актера есть тело box2d,при удалении он вызывает world.destroyBody ().

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

Поэтому, когда я перехожу список актеров и удаляю их одинодним из них, возможно, что для некоторых из них принадлежащее тело уже уничтожено (поскольку оно является общим).

Могу ли я использовать проверку body.isActive (), чтобы увидеть, было ли это тело уже уничтожено или нетзаконно, поскольку тело уничтожено и его никогда нельзя разыменовывать из java?

Похоже, body.isActive () выдает false после того, как тело было удалено, или это какой-то побочный эффект?Я спрашиваю о проблемах (например, знаменитый случайный сбой 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 Ответ

0 голосов
/ 08 апреля 2019

Хорошо, это нормально работало на моем рабочем столе, то есть вызов body.isActive () возвращает false для уничтоженных объектов и не вызывает проблем со стабильностью.

Но при развертывании на телефон Android вызов body.isActive () для уничтоженного тела возвращает значение true.

Не пытаюсь определить там правило, так как я новичок, но это выглядит так:

Я бы сказал, что после уничтожения тела (и уничтожения в нативном коде) поведение любых вызовов, которые вы делаете по старой ссылке, не определено или приводит к немедленным / последующим сбоям Box2d.

Так что я не буду делать никаких вызовов для мертвой ссылки box2d, поэтому мы не можем использовать body.isActive () после уничтожения тела.

Лучшей практикой будет присвоение вашей ссылки на null сразу после того, как вы уничтожили тело. Наличие метода destroyBody (), который уничтожает body и всегда возвращает 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
...