在 LibGDX 中使用 ContactListener 的正确方法

Proper way to use ContactListener in LibGDX

我正在 LibGDX 使用 Box2D 开发游戏。我是新手,所以我一直在关注 Brent Aureli 的教程,他在教程中创建了一个 class 实现 ContactListener 以检测所有碰撞并根据接触进行切换。

我认为这有点过分,因为我不想检测所有碰撞,而只想检测某些物体中的一些碰撞。

有没有办法只在某个body中实现ContactListener?如果没有,是否有更好的方法来更有效地解决冲突?

在 Box2D ContactListener 中,每次联系人启动时都会调用 BeginContact 方法,无论您是否有代码来处理它。

例如,下面的代码摘自我的一个项目的 ContactListener。

@Override
public void beginContact(Contact contact) {
    //System.out.println("Contact");
    Fixture fa = contact.getFixtureA();
    Fixture fb = contact.getFixtureB();

    if(fa.getBody().getUserData() instanceof Brick){
        this.brickHit((Brick) fa.getBody().getUserData(), fb);
    }else if(fb.getBody().getUserData() instanceof Brick){
        this.brickHit((Brick) fb.getBody().getUserData(), fa);
    }

    if(fa.getBody().getUserData() instanceof Pad){
        this.padHit((Pad) fa.getBody().getUserData(), fb);
    }else if(fb.getBody().getUserData() instanceof Pad){
        this.padHit((Pad) fb.getBody().getUserData(), fa);
    }

    if(fa.getBody().getUserData() instanceof Bin){
        objectInVoid(fb);
    }else if(fb.getBody().getUserData() instanceof Bin){
        objectInVoid(fa);
    }

    if(fa.getBody().getUserData() instanceof Ball){
        ballHitSomething((Ball) fa.getBody().getUserData(),fb);
    }else if(fb.getBody().getUserData() instanceof Ball){
        ballHitSomething((Ball) fb.getBody().getUserData(),fa);
    }

    if(fa.getBody().getUserData() instanceof Bomb){
        bombHitSomething((Bomb) fa.getBody().getUserData(),fb);
    }else if(fb.getBody().getUserData() instanceof Bomb){
        bombHitSomething((Bomb) fb.getBody().getUserData(),fa);
    }

    if(fa.getBody().getUserData() instanceof LocalEffectEntity){
        if(fa.isSensor()){
            inLocalEffectRange((LocalEffectEntity) fa.getBody().getUserData(),fb);
        }else{
            objectInVoid(fb);
        }
    }else if(fb.getBody().getUserData() instanceof LocalEffectEntity){
        if(fb.isSensor()){
            inLocalEffectRange((LocalEffectEntity) fb.getBody().getUserData(),fa);
        }else{
            objectInVoid(fa);
        }
    }
}