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