我正在使用Box2D与LibGDX开发游戏。我是新手,所以我一直在关注Brent Aureli的教程,在其中他创建了一个实现ContactListener的class,以便检测所有碰撞并根据联系人进行切换。
我认为这有点过分,因为我不想检测所有的碰撞,只有少数人会发现这些碰撞。
有没有办法只在某个正文中实现ContactListener?如果没有,是否有更好的方法来更有效地解决冲突?
答案 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);
}
}
}