Как полностью удалить мир бокса и все его тела? Никакой вразумительной инфы не нашел, кроме как удаление тел, и то нигде не указано было что нада удалять когда мир не заблочен?
// Удаление всех тел
var body:b2Body = this.m_world.GetBodyList();
while (body) {
if (body.GetUserData () as IObjectBasic) {
(body.GetUserData () as IObjectBasic).free ();
}
body = body.GetNext ();
}
// Инициализация мира
var worldAABB:b2AABB = new b2AABB();
worldAABB.lowerBound.Set(-10.0, -10.0);
worldAABB.upperBound.Set(1800.0, 150.0);
// Define the gravity vector
var gravity:b2Vec2 = new b2Vec2(0.0, 10.0);
// Allow bodies to sleep
var doSleep:Boolean = true;
// Construct a world object
m_world = new b2World(worldAABB, gravity, doSleep);
Я так понял вы описали в 2.0.2, а нада 2.1.а И удаляете вы юзердаты тел а не сами тела.
Wells77
Перевожу:
> Никакой вразумительной инфы не нашел
- мануала не читал
> полностью удалить мир и все его тела
ликбез в главе 10
CasDev
> ликбез в главе 10
пробовал, не помогает
Вообщем я тоже мучался и в результате сделал так (правда у меня на js, но алгоритм простой) - когда у меня создается любое тело, я помещаю его в специальный массив, когда во время игры тело надо удалить, то я его и из массива удаляю. Таким образом у меня есть постоянный массив живых тел, как только надо очистить мир, я просто пробегаю по этому массиву и все удаляю. Провел несколько тестов, все прекрасно работает:) Все остальные медоты у меня не прокатили, может конечно что то недопонимаю, но по другому не получалось
За свежий мануал респект и спасибо. На глаза только 2.0.2 версии попадались. Удалять все тела и мувики привязаные к ним со слушателями я понял как. А вот интересовало именно удаление самого мира. Его обизательно делать delete если вручную все тела поудалял с него?
DenBraun
Блин, там же даже код дан и написано, почему так а не иначе... Е-мае...
Wells77
> Его обизательно делать delete если вручную все тела поудалял с него?
Я обычно в соответсвующих менеджерах делаю функцию reset, которая сперва вызывает функцию destroyPhysics, а затем createPhysics. Так код банально понятнее.
CasDev
> Блин, там же даже код дан и написано, почему так а не иначе... Е-мае...
Потому что не срабатывает, все остается и ничего не происходит, не знаю почему, пробовал по разному:(
В результате я решил не удалять мир, а просто очищать его и дальше продолжать с ним работать, проводил тесты по расходу памяти, все норм
Провел вчера диспетчером задач тест по рестартам лвл не удаляя сам мир а только очищая его полностью от тел - десятки рестартов подряд и память вроде как на одном месте плюс/минус пару мб
Wells77
Я мир удаляю только по одной причине - не люблю выделенную зазря память.
То есть - игрок у меня зашел в игру, загрузил левел, поиграл, вышел в главное меню. В главном меню мне world_ нафиг не сдался, поэтому перед выходом в главное меню он удаляется.
А так оба подхода имею право на жизнь.
Вам подход (не удаляя мир) хорош тем, что world_ уже порядком кучу загреб под объекты, поэтому всяких реаллоков будет по минимуму.
Мой подход (с удалением мира) хорош тем, что не держит лишнюю память в куче.
Я вообще еще дальше пошел)), сделал что то типа контроллера и мир использую везде, в том числе и под меню, то есть поиграл игрок нажал выход, мир чистится и тут же заполняется телами для меню. Так у меня добавилось куча всяких возможностей для меню, то есть все есть физические объекты и я с элементами менюшек могу всякие приколы делать без проблем, подкидывать, подвешивать, пружинить и тд.:)
Тема в архиве.