Box2D Flash, Уничтожение тел - PullRequest
0 голосов
/ 27 ноября 2010

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

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

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

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

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

Спасибо,
Будет

РЕДАКТИРОВАТЬ: [решено] Спасибо, ребята, это имеет смысл.

Ответы [ 2 ]

6 голосов
/ 27 ноября 2010

Я сам сталкивался с этой проблемой в некоторых проектах. Я думаю, что это происходит, когда вы пытаетесь удалить тело, которое «используется» движком 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 голосов
/ 27 ноября 2010

Чтобы добавить к тому, что сказал Маттиас, я делаю то же самое, что и он, помещая объекты в список 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);
    }
}

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

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

Таким образом, это работает гладко.

...