碰撞没有在联系人监听器中注册? [Libgdx + Box2d]

时间:2013-08-16 18:01:42

标签: java box2d libgdx

我的游戏中的碰撞问题:对于某些实体,它与在联系人监听器中注册不一致。具体来说,我的子弹和导弹经常穿过其他实体/怪物,操作词往往是,有时他们这样做,我无法确定造成这种不一致的原因。我已将它们都设置为“子弹”以进行连续碰撞,并且它们不会令人讨厌地快速行进,所以我没有想法。

以下是展示此问题的视频:

http://www.youtube.com/watch?v=FMLkg5r3dpo

这是我的联系人听众:

public class Collisions implements ContactListener {

public Collisions() {       
}

@Override
public void beginContact(Contact contact) {
    Body a = contact.getFixtureA().getBody();
    Body b = contact.getFixtureB().getBody();

    if (a.getUserData() instanceof Bullet && b.getUserData() instanceof Enemy) {
        Bullet bullet = (Bullet) a.getUserData();
        Enemy enemy = (Enemy) b.getUserData();

        enemy.harm(10);
        bullet.kill();
    } 

    if (a.getUserData() instanceof Missile && b.getUserData() instanceof Enemy) {
        Missile missile = (Missile) a.getUserData();
        Enemy enemy = (Enemy) b.getUserData();

        enemy.harm(40);
        missile.kill();
    } 

    if (a.getUserData() instanceof Craft && b.getUserData() instanceof Enemy) {
        Craft craft = (Craft) a.getUserData();
        Enemy enemy = (Enemy) b.getUserData();

        craft.harm(5);
        enemy.harm(10);
    } 
}

@Override
public void endContact(Contact contact) {       
}

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

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

}

1 个答案:

答案 0 :(得分:2)

我相信你还需要检查夹具B是子弹还是导弹​​。 来自http://www.iforce2d.net/b2dtut/collision-anatomy

  

A和B灯具没有特定的顺序,因此您经常需要在灯具或其主体中设置用户数据,以便您可以知道灯具所属的对象。从这些灯具中,你可以通过GetBody()找到碰撞的物体。