0

Это проблема, которую я давно хотел решить, хотя я никогда не могу найти способ ее исправить. Я думаю, что я могу что-то упустить, но я не могу найти что-то.Box2D Flash, Уничтожающие тела

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

world.DestroyBody(_body) он, кажется, ничего не делает. Форма остается на экране.

У кого-нибудь была эта проблема раньше? Это заставляет меня беспокоиться, потому что через некоторое время, играя в игру, все объекты, которые я хочу уничтожить, остаются на экране и все еще регистрируют столкновения, которые действительно отстают от игры.

Любая помощь будет высоко ценится,

Спасибо,
Will

EDIT: [РЕШЕНО] Спасибо, ребята, что имеет смысл.

+0

Когда вы пытаетесь удалить объект? Если вы пытаетесь удалить объект в обратном вызове обработчика конфликтов, это может быть вашей проблемой. У Маттиаса есть правильная идея, нажав объекты на список, а затем связавшись с ними вне метода обновления объекта b2World. – 2012-04-16 15:53:23

ответ

6

У меня была эта проблема в некоторых проектах. Я думаю, что это происходит, когда вы пытаетесь удалить тело, которое «используется» с помощью Box2D. Я решил это, добавив тела, которые я хочу уничтожить, и уничтожу их до следующего рендеринга.

// add body to list if it should be removed 
if(shouldRemoveBody) 
{ 
    _removeList.push(bodyToRemove); 
} 

// start next render with a check 
if(_removeList.length > 0) 
{ 
    // remove all bodies in list 
} 
3

Чтобы добавить к тому, что сказал Маттиас, я делаю то же самое, что он делает, нажав объекты в списке ToBeRemoved.

и у меня есть класс актера для каждого графического спрайта в сцене, вот некоторый код:

public class Actor 
{ 
    protected var m_body:b2Body; 
    protected var m_sprite:DisplayObject; 

    public function Actor(body:b2Body, sprite:DisplayObject) 
    { 
     this.m_body = body; 
     this.m_sprite = sprite; 
    } 

    public function destroy():void 
    { 
     // remove sprite 
     m_sprite.parent.removeChild(m_sprite); 

     // remove physical body 
     GlobalVars.world.DestroyBody(m_body); 
    } 
} 

и всякий раз, когда я хочу, чтобы уничтожить объект, я просто вызвать метод уничтожить актера.

Обратите внимание, что поля этого класса защищены, поэтому мы можем продлить его дочерними субъектами.

Таким образом, он работает плавно.