2017-04-20 3 views
0

Box2D를 사용하여 LibGDX로 게임을 개발 중입니다. 나는 초보자 다. 그래서 나는 Brent Aureli의 튜토리얼을 따라 갔다. 그는 모든 충돌을 감지하고 접촉에 따라 전환하기 위해 ContactListener를 구현하는 class을 만든다.LibGDX에서 ContactListener를 사용하는 적절한 방법

나는 모든 충돌을 감지하고 싶지는 않지만 약간의 신체에서만 약간 과도하다고 생각합니다.

특정 본문에서만 ContactListener를 구현할 수있는 방법이 있습니까? 그렇지 않은 경우 충돌을보다 효율적으로 해결할 수있는 더 나은 방법이 있습니까?

+0

"특정 신체"란 무엇을 의미합니까? 그 계급은 참으로 모든 접촉을 요구 받지만, 다르게 대우 할 수있는 방법이 있습니다. –

+0

ContactListener를 단일 box2d 본문에 추가하여이 단일 본문이 충돌 할 때만 호출하도록하겠습니다. 나는 새로운 충돌이있을 때마다 모든 접촉을 다루고 싶지 않다. – forameuss

+0

'ContactFilter' 클래스가 있지만 전체 "world"에 대해 전역입니다. '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

관련 문제