在LibGDX中使用ContactListener的正确方法

时间:2017-04-20 10:57:08

标签: java libgdx box2d

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

我认为这有点过分,因为我不想检测所有的碰撞,只有少数人会发现这些碰撞。

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

1 个答案:

答案 0 :(得分:0)

在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);
        }
    }
}