0

これは私がしばらく解決したいと思っていた問題ですが、それを修正する方法を見つけることはできません。何かが足りないのではないかと思いますが、なにか見つからないようです。

私はb2Worldからボディを破壊しようとしています。さまざまなチュートリアルで、デバッグ描画をオンにしてbox2d内のオブジェクトを破壊すると、シェイプも破壊されることを確認しました。私がするときの何らかの理由で:

world.DestroyBody(_body)何もしていないようです。図形は画面に残ります。

誰かが以前にこの問題を抱えたことはありますか?ゲームをプレイしてしばらくすると、破壊したいすべてのオブジェクトが画面に残り、ゲームに実際に遅れる衝突を記録するので、心配になります。

どんな助けでも大歓迎です、

ありがとう、
ウィル

編集:[解決済み]みんなありがとう、それは完全に理にかなっています。

4

2 に答える 2

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
}
于 2010-11-27T18:44:29.370 に答える
3

Mattias が言ったことに付け加えると、オブジェクトを 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);
    }
}

オブジェクトを破棄したいときはいつでも、アクタの destroy メソッドを呼び出すだけです。

このクラスのフィールドは保護されているため、子アクターによって拡張できることに注意してください。

このように、スムーズに動作します。

于 2010-11-27T20:31:24.937 に答える