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);
}
}
}
"특정 신체"란 무엇을 의미합니까? 그 계급은 참으로 모든 접촉을 요구 받지만, 다르게 대우 할 수있는 방법이 있습니다. –
ContactListener를 단일 box2d 본문에 추가하여이 단일 본문이 충돌 할 때만 호출하도록하겠습니다. 나는 새로운 충돌이있을 때마다 모든 접촉을 다루고 싶지 않다. – forameuss
'ContactFilter' 클래스가 있지만 전체 "world"에 대해 전역입니다. 'ContactListener'는 또한 세계 전역에 걸쳐 있기 때문에 안타깝게도 앱의 다른 것들이 충돌을 일으키지 않는 한, 유일한 진정한 방법은 그 자체로는 작동하지 않는 하나의 접촉 청취자를 갖는 것입니다. 그러나보다 전문화 된 청취자를 등록 할 수 있습니다 이벤트를 적절하게 파견합니다. –