2012-06-02 4 views
0

저는 cocos2D와 Box2D를 사용하여 Mac OS 용 게임을 작성하고 있습니다. 다음과 같이 나는 나의 세계에 b2ContactListener 서브 클래스를 추가했습니다 :Box2D에서 세계의 연락처 수신기 받기

contactListener = new ContactListener(); 
world->SetContactListener(contactListener); 

이 완벽하게 작동하지만, 나는 현재 직접이없는 다른 클래스에서 연락처 리스너에 액세스하는 가장 좋은/접수 방법 확실치 접촉 청취자에 대한 참조.

나는 그것을 필요로하는 다른 클래스에 대한 참조를 전달할 수 있지만 더 좋은 방법이 있는지 궁금한 것이있다. Box2D의에서

world->GetContactListener(); 

: 나는이 작업을 수행하는 방법을 찾을 수 있지만보다 구체적으로, 어떤이의 상응하는가?

내가 이것을하려고하는 이유는 간단히 말해서 게임 로직 (즉, 몸체가 접촉 청취자의 정보를 기반으로 점프 할 수 있는지 여부)을 관련 클래스 자체로 옮기는 것을 선호하기 때문입니다. 메인 게임 플레이 클래스에서.

감사합니다.

+1

연락처 청취자는 어떤 일이 발생할 때까지 기다리는 것이지만, 직접 물어 보지 마십시오. 아마도 접촉 청취자가 게임 객체에 함수를 호출하여 그들이 만진 다른 객체를 알 수있게 할 수 있습니다. – iforce2d

+0

@ iforce2d 반드시 필요한 것은 아닙니다. 현재 단계에 대한 시뮬레이션이 계산 된 후에 만 ​​box2d 본문 상태를 변경하면 안됩니다. 또한 컨택트 리스너는 현재 시뮬레이션 단계가 완료된 후이를 분석하는 데 사용됩니다. – giorashc

+0

사실이 아닌 것은 무엇입니까? 시간 단계에서 신체 상태를 바꾸어야하는 곳은 어디입니까? 컨택 리스너는 시간 단계에서 호출됩니다. 시간 단계 이후까지 Box2D 세계에서 아무 것도 변경하지 않는 한 사물을 분석 할 수 있습니다. 하지만 원래의 질문으로 돌아가서, 연락 청취자는 BeginContact, EndContact, PreSolve 및 PostSolve의 네 가지 기능에 대한 진입 점 역할을합니다. 일반적으로 멤버 변수가 없기 때문에 아무 것도 얻을 수 없으므로 그 이유는 없습니다. 아마 우리는 존에게 청취자를 얻을 수 있다면 어떻게 할 것인지 물어봐야 할 것입니다. – iforce2d

답변

3

에서 그것을 할 필요가있는 경우 반복자를 사용하여 모든 연락처를 처리 할 수 ​​있다고 생각 PreSolve 및 PostSolve. 일반적으로 멤버 변수가 없으므로 얻을 필요가 없기 때문에 멤버 변수를 얻을 필요가 없습니다.

월드 스텝 중에 이러한 함수 중 하나가 호출되면 두 가지가 터치/터치 중지 등 두 가지를 기록 할 수 있지만 시간 단계가 완료 될 때까지는 아무 것도 변경하지 말아야합니다.

이 질문의 요점은 어떤 것을 만졌는지 기록하는 데 사용되는 방법이라고 생각하지만 실제로는 당신에게 달렸으며 필요한 정보의 종류에 달려 있습니다. 이 당신이 thingsThatTouched를 확인해야합니다 작동하려면

std::vector< std::pair<b2Fixture*, b2Fixture*> > thingsThatTouched; 

//in BeginContact 
thingsThatTouched.push_back(make_pair(contact->GetFixtureA(), contact->GetFixtureB())); 

//after the time step 
for (int i = 0; i < thingsThatTouched.size(); i++) { 
    b2Fixture* fixtureA = thingsThatTouched[i].first; 
    b2Fixture* fixtureB = thingsThatTouched[i].second; 
    // ... do something clever ... 
} 
thingsThatTouched.clear(); //important!! 

예를 들어 경우 BeginContact에만 관심이있어, 다음 절대 간단한 방법은 두기구는 쌍의 목록으로 감동 단지 상점에 수 있습니다 목록은 연락처 리스너 함수에서 볼 수 있으므로 전역 변수이거나 연락처 리스너 클래스에서이 포인터를 설정할 수도 있고 목록에 대한 포인터를 반환하는 전역 함수를 가질 수도 있습니다. 당신은 그들이 등을 만졌을 때 영향을 얼마나 열심히 일을 기준으로 시간 단계 이후에 뭔가를 같은 것을 이 감동 중지 무엇으로 자세한 내용을 추적하거나 할 필요가있는 경우

, 그것은 조금 더 많은 작업을 더하게됩니다 특유한.이 한 몸이 접촉되는 다른 것들의 목록을 업데이트 BeginContact/EndContact를 사용

, 그리고 플레이어가 주어진 시간에 이동할 수 있습니다 여부를 결정하는 데 사용 : 당신은 도움이 자습서를 찾을 수 있습니다 http://www.iforce2d.net/b2dtut/jumpability

이 하나가 자동차 타이어에서 현재 표면의 유형을보고 비슷한 방법을 사용, 표면이 얼마나 많은 마찰을 결정합니다 : http://www.iforce2d.net/b2dtut/top-down-car

을이 하나가 결정 PreSolve를 사용하는지 여부를 두 물체 (화살표 및 대상) 충돌 속도에 따라 충돌 할 때 서로 붙어 있어야합니다. 실제 '집착'처리는 시간 단계가 완료된 후에 수행됩니다. http://www.iforce2d.net/b2dtut/sticky-projectiles

0

나는, 당신은 단순히 GetContactList를 호출 한 다음 다른 장소 A 접점 리스너가 바로 네 가지 기능에 대한 진입 점 BeginContact, EndContact 역할을

+0

특별히 'ContactListener' 클래스의 멤버 변수에 액세스하려고하고 있습니다. 따라서 불행히도 도움이되지 않습니다. – jonmorgan

+0

이 경우에는 연락처 수신기에 대한 액세스를 제공하거나 싱글 톤으로 만들거나 일부 글로벌 데이터 클래스의 인스턴스로 만들 수 있습니다. 그렇지만 그렇게해야한다고 생각하지는 않습니다. – Morion

관련 문제