发生碰撞时从世界中移除身体

时间:2013-08-22 13:28:49

标签: java android box2d libgdx

我是libgdx和java的新手。

我正在从libgdx的文档中扩展Simple App游戏。 我制作了雨滴和斗体,还制作了一个“地面”的身体。

本教程以这种方式处理碰撞检测:

Iterator < Body > iter = raindrops.iterator();
while (iter.hasNext()) {
    Body raindrop = iter.next();
    if (raindrop.y + 64 < 0) {
        dropped++;
        iter.remove();
    }
    if (raindrop.overlaps(bucket)) {
        dropSound.play();
        catched++;
        iter.remove();
    }
}

它按预期工作,但由于我让每个雨滴成为一个身体,我不能再使用overlaps()函数了,所以我不得不使用box2d的碰撞检测:

Iterator < Body > iter = raindrops.iterator();
while (iter.hasNext()) {
    Body raindrop = iter.next();

    world.setContactListener(new ContactListener() {

        @Override
        public void beginContact(Contact contact) {
            Fixture fixtureA = contact.getFixtureA();
            Fixture fixtureB = contact.getFixtureB();
            if ((String) fixtureA.getBody().getUserData() == "bucket" && (String) fixtureB.getBody().getUserData() == "drop" || (String) fixtureA.getBody().getUserData() == "drop" && (String) fixtureB.getBody().getUserData() == "bucket") {
                //csepp és vödör ütközik
                dropSound.play();
                catched++;
                iter.remove();

            }
            if ((String) fixtureA.getBody().getUserData() == "ground" && (String) fixtureB.getBody().getUserData() == "drop" || (String) fixtureA.getBody().getUserData() == "drop" && (String) fixtureB.getBody().getUserData() == "ground") {
                //csepp és föld ütközik
                dropped++;
                iter.remove();
            }
        }

        @Override
        public void endContact(Contact contact) {}

        @Override
        public void preSolve(Contact contact, Manifold oldManifold) {
            // TODO Auto-generated method stub

        }

        @Override
        public void postSolve(Contact contact, ContactImpulse impulse) {
            // TODO Auto-generated method stub

        }

    });
}

我的主要问题是iter.remove();没有删除正确的雨滴。碰撞时,它会移除最新的雨滴,而不是与桶相撞的雨滴。

此外,box2d正文无法删除。

我该怎么做?谢谢!

1 个答案:

答案 0 :(得分:2)

不要将字符串保存为UserData,而是保存对实体的引用(雨滴,桶......)。然后你会知道哪个雨滴确实导致了碰撞,你可以完全删除那个。正文将通过World.destroyBody(...)删除。

但是在物理步骤处理时你无法调用该方法。这意味着,您不能直接在碰撞回调中使用它。

相反:将要删除的实体放在临时列表中,并在物理步骤之后运行此列表并将其删除。

相关问题