Войти
Box2DФорумОбщее

Удаление мира

#0
13:42, 19 фев. 2014

Как полностью удалить мир бокса и все его тела? Никакой вразумительной инфы не нашел, кроме как удаление тел, и то нигде не указано было что нада удалять когда мир не заблочен?


#1
14:20, 19 фев. 2014

// Удаление всех тел
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
14:30, 19 фев. 2014

Я так понял вы описали в 2.0.2, а нада 2.1.а И удаляете вы юзердаты тел а не сами тела.

#3
17:07, 19 фев. 2014

Wells77
Перевожу:
> Никакой вразумительной инфы не нашел
- мануала не читал

> полностью удалить мир и все его тела
ликбез в главе 10

#4
18:41, 19 фев. 2014

CasDev
> ликбез в главе 10
пробовал, не помогает

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

#5
19:54, 19 фев. 2014

За свежий мануал респект  и спасибо. На глаза только 2.0.2 версии попадались. Удалять  все тела и мувики привязаные к ним со слушателями я понял как. А вот интересовало именно удаление самого мира. Его обизательно делать delete если вручную все тела поудалял с него?

#6
22:26, 19 фев. 2014

DenBraun
Блин, там же даже код дан и написано, почему так а не иначе... Е-мае...

Wells77
> Его обизательно делать delete если вручную все тела поудалял с него?
Я обычно в соответсвующих менеджерах делаю функцию reset, которая сперва вызывает функцию destroyPhysics, а затем createPhysics. Так код банально понятнее.

#7
22:43, 19 фев. 2014
Я обычно в соответсвующих менеджерах делаю функцию reset, которая сперва вызывает функцию destroyPhysics, а затем createPhysics. Так код банально понятнее

Ну рестарт у меня так и реализован, сначала удаляю все тела с мира, удаляю все юзердаты и их слушатели, обнуляю все ссылки. А потом просто заново функцию Init() запускаю, где по новой мир создается и все тела. Но я не делаю никаких delete world и тут вопрос остается - этот мир так и остается висеть в памяти или же если тел нету в нем он очищается сборщиком мусора?
#8
11:15, 20 фев. 2014

CasDev
> Блин, там же даже код дан и написано, почему так а не иначе... Е-мае...
Потому что не срабатывает, все остается и ничего не происходит, не знаю почему, пробовал по разному:(

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

#9
11:23, 20 фев. 2014

Провел вчера диспетчером задач тест по рестартам лвл не удаляя сам мир а только очищая его полностью от тел - десятки рестартов подряд и память вроде как на одном месте плюс/минус пару мб

#10
13:20, 20 фев. 2014

Wells77
Я мир удаляю только по одной причине - не люблю выделенную зазря память.

То есть - игрок у меня зашел в игру, загрузил левел, поиграл, вышел в главное меню. В главном меню мне world_ нафиг не сдался, поэтому перед выходом в главное меню он удаляется.

А так оба подхода имею право на жизнь.
Вам подход (не удаляя мир) хорош тем, что world_ уже порядком кучу загреб под объекты, поэтому всяких реаллоков будет по минимуму.
Мой подход (с удалением мира) хорош тем, что не держит лишнюю память в куче.

#11
15:01, 20 фев. 2014

Я вообще еще дальше пошел)), сделал что то типа контроллера и мир использую везде, в том числе и под меню, то есть поиграл игрок нажал выход, мир чистится и тут же заполняется телами для меню. Так у меня добавилось куча всяких возможностей для меню, то есть все есть физические объекты и я с элементами менюшек могу всякие приколы делать без проблем, подкидывать, подвешивать, пружинить и тд.:)

Box2DФорумОбщее

Тема в архиве.