我是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正文无法删除。
我该怎么做?谢谢!
答案 0 :(得分:2)
不要将字符串保存为UserData,而是保存对实体的引用(雨滴,桶......)。然后你会知道哪个雨滴确实导致了碰撞,你可以完全删除那个。正文将通过World.destroyBody(...)
删除。
但是在物理步骤处理时你无法调用该方法。这意味着,您不能直接在碰撞回调中使用它。
相反:将要删除的实体放在临时列表中,并在物理步骤之后运行此列表并将其删除。