2012-11-13 2 views
2

두 바디 사이에 접촉이 이루어질 때 용접 접합을 만드는 접점 리스너를 설정했습니다. 몸은 내가 클래스연락처 리스너 클래스 내에 용접 접합부를 생성하는 데 문제가 발생했습니다.

b2World.cpp 

내 방법

b2Joint* b2World::CreateJoint(const b2JointDef* def) 

에 선

b2Assert(IsLocked() == false); 

에 SIGABRT 가리키는가 계속 터치하면 다음의 연락처 리스너 클래스입니다 : SubcContactListener. h :

#import <Foundation/Foundation.h> 
#import "cocos2d.h" 
#import "Box2D.h" 
#import "Spriter.h" 
#import "CreateRope.h" 

class SubcContactListener : public b2ContactListener { 
public: 
void  *helloWorldLayer; 

b2WeldJoint *weldJoint; 
b2World *world; 

void BeginContact(b2Contact* contact); 
void EndContact(b2Contact* contact); 
void createWeldJoint(b2Body* ABody ,b2Body* BBody); 
//void destroyWeldJoint(b2WeldJoint *weldJoint); 

}; 

SubcContactListener.mm 다음 HelloWorldLayer.mm initPhysics 방법에서 또한

#import "SubcContactListener.h" 
#import "HelloWorldLayer.h" 


void SubcContactListener:: BeginContact(b2Contact *contact) { 

} 

void SubcContactListener:: EndContact(b2Contact *contact) { 
b2Fixture  *fixtureA = contact->GetFixtureA(); 
b2Fixture  *fixtureB = contact->GetFixtureB(); 
b2Body   *fixtureABody = fixtureA->GetBody(); 
b2Body   *fixtureBBody = fixtureB->GetBody(); 

// We don't care about collisions that don't involve two bodies. 
if (helloWorldLayer && fixtureABody && fixtureBBody) 
{ 

    if(fixtureABody != NULL && fixtureBBody != NULL){ 
     createWeldJoint(fixtureABody, fixtureBBody); 
    } 

} 

} 
void SubcContactListener:: createWeldJoint(b2Body* ABody ,b2Body* BBody) { 

// The sprite tag is 1 for the spriter sprite and 3 for the rope links. 
if (ABody && BBody) 
//{ 
    CCSprite   *bodyASprite = (CCSprite *) ABody->GetUserData(); 
    CCSprite   *bodyBSprite = (CCSprite *) BBody->GetUserData(); 
    NSInteger   bodyASpriteTag = bodyASprite.tag; 
    NSInteger   bodyBSpriteTag = bodyBSprite.tag; 

    if (((bodyASpriteTag == 1) && (bodyBSpriteTag == 3)) || 
     ((bodyASpriteTag == 3) && (bodyBSpriteTag == 1))) 
    { 

     //creation of weldjoint 
     if (ABody!= NULL && BBody != NULL) { 


     b2WeldJointDef  weldJointDef; 
     weldJointDef.Initialize(ABody, 
           BBody, 
           ABody->GetWorldCenter()); 
     weldJointDef.collideConnected = false; 

     weldJoint = (b2WeldJoint*) ABody->GetWorld()->CreateJoint(&weldJointDef); 
     } 
    } 
} 

} 

: 오류에서

// Create contact listener 
contactListener = new SubcContactListener(); 
contactListener->helloWorldLayer = self; 
world->SetContactListener(contactListener); 

는 나는 너무 확실하지 용접 조인트 함께 할 수있는 뭔가가있다 생각합니다. 도와주세요.

답변

1

콜백 내에서 월드를 수정할 수 없습니다. assert 문은 시뮬레이션 단계를 시작하기 위해 세계를 잠 갔음을 나타내므로 해당 작업을 수행 할 수 없습니다.

이 문제는 연락처 이벤트를 캐싱하고 시뮬레이션 단계 후이를 처리하여 해결됩니다.