2017-04-20 18 views
0

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

我认为这有点过分,因为我不想检测所有的碰撞,但只有少数人在特定的机构。

是否有一种方法只能在特定的实体中实现ContactListener?如果没有,是否有更好的方法来更有效地解决冲突?

+0

你是什么意思的“某些身体”?每个联系人的确需要这门课,但它有不同的对待方式。 –

+0

我想添加一个ContactListener到一个box2d主体,所以它只会在这个单体碰撞时调用它。每次发生新的碰撞时,我都不想处理所有的联系。 – forameuss

+0

有'ContactFilter'类,但它对整个“世界”是全球性的。 'ContactListener'对全世界来说也是全球性的,所以很遗憾,除非你的应用程序中没有其他东西可以碰撞,否则唯一真正的方法是让一个单独的联系人侦听器本身无法工作,但它允许将更多专用的侦听器注册到本身并适当地向他们发送事件。 –

回答

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); 
     } 
    } 
} 
+0

谢谢,这将帮助我。 – forameuss