破坏JBox2D android上的身体

时间:2014-04-09 09:52:48

标签: android box2d game-physics jbox2d

我需要在JBox2D安卓游戏中摧毁一个身体的碰撞。我发现JBox2D世界在身体接触时变得锁定。我想在碰撞后摧毁一个身体。世界发布锁定后,我可以收到任何回电吗?我找到了一个选项,可以将主体添加到数组中以进行销毁。但何时摧毁身体?我在这个游戏中没有使用andengine / libgdx。找到下面的碰撞监听器类,

private class CollisionListener implements ContactListener {

    @Override
    public void beginContact(Contact contact) {
        Object fixtureA = contact.getFixtureA().getUserData();
        Object fixtureB = contact.getFixtureB().getUserData();
        Body mBodyA = contact.getFixtureA().getBody();
        Body mBodyB = contact.getFixtureB().getBody();
        if (fixtureA instanceof Bullet) {
            destroyBalloonBody(mBodyB);
        }
        if (fixtureB instanceof Bullet) {
            destroyBalloonBody(mBodyA);
        }

    }

    @Override
    public void endContact(Contact contact) {

    }

    @Override
    public void postSolve(Contact contact, ContactImpulse contactImpulse) {

    }

    @Override
    public void preSolve(Contact contact, Manifold manifold) {

    }
}

public void destroyBalloonBody(Body balloon){

//Can i start  a new thread which is having a loop until the world become release for destroying the body
//Or
//Do i need to add the body to a deletionArrayList to destroy it.

}

1 个答案:

答案 0 :(得分:2)

我认为问题是你在碰撞回调期间试图移除身体。

来自Box2D手册:

  

实施改变物理世界的游戏逻辑很诱人   在联系人回调中。例如,您可能发生了碰撞   应用伤害并试图摧毁相关的演员及其僵硬   身体。但是,Box2D不允许你改变物理世界   在回调中,因为你可能会破坏Box2D所在的对象   目前处理,导致孤儿指针。

也就是说,你不应该破坏碰撞回调中的物体。

你应该存储你想要销毁的物体的引用,并在更新周期后使用World引用将它们销毁。

这是你需要的吗?