0

我对 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 主体不会被移除。

我怎样才能做到这一点?谢谢!

4

1 回答 1

2

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

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

相反:将要移除的物体放在一个临时列表中,并在物理步骤之后运行此列表并将它们移除。

于 2013-08-22T13:44:45.513 回答