我正在使用Box2D开发一个使用LibGDX的游戏。我是新手,所以我一直关注Brent Aureli的教程,他在其中创建了一个实现ContactListener的class,以检测所有碰撞并根据联系进行切换。在LibGDX中使用ContactListener的正确方法
我认为这有点过分,因为我不想检测所有的碰撞,但只有少数人在特定的机构。
是否有一种方法只能在特定的实体中实现ContactListener?如果没有,是否有更好的方法来更有效地解决冲突?
我正在使用Box2D开发一个使用LibGDX的游戏。我是新手,所以我一直关注Brent Aureli的教程,他在其中创建了一个实现ContactListener的class,以检测所有碰撞并根据联系进行切换。在LibGDX中使用ContactListener的正确方法
我认为这有点过分,因为我不想检测所有的碰撞,但只有少数人在特定的机构。
是否有一种方法只能在特定的实体中实现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);
}
}
}
谢谢,这将帮助我。 – forameuss
你是什么意思的“某些身体”?每个联系人的确需要这门课,但它有不同的对待方式。 –
我想添加一个ContactListener到一个box2d主体,所以它只会在这个单体碰撞时调用它。每次发生新的碰撞时,我都不想处理所有的联系。 – forameuss
有'ContactFilter'类,但它对整个“世界”是全球性的。 'ContactListener'对全世界来说也是全球性的,所以很遗憾,除非你的应用程序中没有其他东西可以碰撞,否则唯一真正的方法是让一个单独的联系人侦听器本身无法工作,但它允许将更多专用的侦听器注册到本身并适当地向他们发送事件。 –