나는 box2d를 사용하고 있고 내가 월드 타임 스텝에서 파손되고있는 것으로 나타났습니다. 이 시체를 참조하는 연락처를 가져 오는 중. Contact Listener가 충돌합니다. Box2D 본체가 시간 단계 바깥에서 파손되었을 때
이
은 presolve에서 수행과 접촉 리스너의 접촉 방법을 시작되는 것입니다 :const b2Body* bodyA = contact->GetFixtureA()->GetBody();
const b2Body* bodyB = contact->GetFixtureB()->GetBody();
Object * objectA = (Object*)bodyA->GetUserData();
Object * objectB = (Object*)bodyB->GetUserData();
개체가 제거 되었기 때문에 실제로 세계 시간 단계의 외부 (넌센스에 대한 포인터 어느 objectA 또는 objectB). 잘못된 연락처가 생성되고 있거나 더 이상 존재하지 않아야하는 연락처가 여전히 나타납니다.
업데이트
나는 확인하고 올바른 몸이 파괴되고 검증 (뿐만 아니라 그들의 용기의 몸)와 접촉 리스너가 여전히 처리 접촉을 시도하는 것을 찾기 위해 세계 단계에서 코드를 변경 존재하지 않아야합니다. 나는 iOS/Xcode에있게되고 NSZombie를 활성화하고 연락처 본문 userdata가 할당 취소 된 객체 (할당 취소 된 인스턴스로 전송 된 메시지)임을 실제로 확인합니다. Box2d 소스 확인 신체가 파괴되었을 때 실제로 접촉이 끊어졌습니다. 더 많은 Box2D 코드를 거치거나 코드를 변경해야 청취자가받는 이러한 신비한 접촉을 해결할 수 있습니다.
본문에 대한 연락처 수신기에서 수신 한 연락처 (연락처 리스너에서 확인할 때)에 본문의 userdata를 null로 설정했는지 테스트 한 결과 null 사용자 데이터가 없습니다. .
시체를 어떻게 파괴합니까? 코드를 보여주세요. – Pavel
시체는 적절한 방법으로 파괴됩니다 (world-> DestroyBody (body);).나는 시체가 파괴된다는 것을 알고 있습니다. 문제는 오래된 접촉이 신체를 파괴 할 때 제거되지 않는 것처럼 보이므로 이러한 오래된 접촉이 접촉 청취자를 통해 나오고 문제가 발생한다는 것입니다. –
world-> DestroyBody는 모든 신체 접촉을 파괴합니다. 해당 코드는 http://pastebin.com/cKJDfN6c (v2.2.1)를 참조하십시오. 내 생각에, 당신은 똑같은 것을 혼합합니다 (예를 들어, 다른 몸체를 파괴하는 것). – Pavel