2012-07-15 5 views
0

이 문제에 대한 여러 게시물을 읽었지만 특별히 도움이되는 내용을 찾지 못했습니다. 두 명의 스프라이트가 컨택트 리스너를 사용하여 만날 때 용접 조인트를 만들려고합니다. 나는 다음과 같은 오류가 계속 :Apple Mach-O Linker (Id) 오류 문제

Apple Mach-O Linker (Id) Error 
"_touchingBodies", referenced from: 
SubcContactListener::BeginContact(b2Contact*) in SubcContactListener.o 
ld: symbol(s) not found for architecture i386 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

가 여기 내 연락처 청취자입니다. SubcContactListener.h :

#import <Foundation/Foundation.h> 
#import "cocos2d.h" 
#import "Box2D.h" 
#import <vector> 
typedef std::pair<b2Body*, b2Body*> bodyPair; 
typedef std::vector<bodyPair> thingsThatTouched; 

extern thingsThatTouched touchingBodies; 

class SubcContactListener : public b2ContactListener { 

public: 

    void BeginContact(b2Contact* contact); 
void EndContact(b2Contact* contact); 
}; 

SubcContactListener.mm :

#import "SubcContactListener.h" 
void SubcContactListener:: BeginContact(b2Contact *contact) { 

touchingBodies.push_back(std::make_pair(contact->GetFixtureA()->GetBody(), contact->GetFixtureB()->GetBody())); 
} 

제가 첨가 다음 HelloWorldLayer.h 인터페이스

thingsThatTouched touchingBodies; 

.

마지막으로합니다 (타임 스텝 후) HelloWorldLayer.mm의 틱 방법 :

b2WeldJointDef weldJointDef; 
b2WeldJoint *weldJoint; 

for (int i = 0; i < touchingBodies.size(); i++) { 
    b2Body* bodyA = touchingBodies[i].first; 
    b2Body* bodyB = touchingBodies[i].second; 

    weldJointDef.Initialize(bodyA, bodyB, bodyA->GetWorldCenter()); 
    weldJointDef.collideConnected = false; 
    weldJoint = (b2WeldJoint*)world->CreateJoint(&weldJointDef); 

} 
touchingBodies.clear(); 

이 도와주세요, 나는 잠시 동안 그것을있었습니다.

답변

0
extern thingsThatTouched touchingBodies; 

이러한 extern 변수는 인스턴스 변수가 아닌 다른 곳에서 정적 C 변수로 정의해야합니다.

더 나은 디자인을 고려하여 extern 변수를 스크랩하고 HelloWorldLayer를 통해 touchingBody에 액세스하는 대신 Singleton 인터페이스를 추가하는 것이 좋습니다.

당신은 어디에서 액세스 할 수있을 것입니다 :

[HelloWorldLayer sharedWorldLayer].touchingBodies; 
관련 문제