0

この問題に関する多くの投稿を読みましたが、特に役立つものは見つかりませんでした。コンタクト リスナーを使用して 2 つのスプライトが出会うときに、weldJoint を作成しようとしています。次のエラーが発生し続けます。

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()) );
}

追加した:

 thingsThatTouched touchingBodies;

HelloWorldLayer.h インターフェイスに。

最後に、HelloWorldLayer.mm の tick メソッドで (タイムステップの後):

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();

助けてください、私はしばらくそれを続けてきました。

4

1 に答える 1

0
extern thingsThatTouched touchingBodies;

このような外部変数は、インスタンス変数ではなく、他の場所で静的C変数として定義する必要があります。

より良い設計に照らして、extern変数を破棄し、代わりにシングルトンインターフェイスを追加してHelloWorldLayerを介してtouchingBodiesにアクセスすることをお勧めします。

そうすれば、どこからでもアクセスできるようになります。

[HelloWorldLayer sharedWorldLayer].touchingBodies;
于 2012-07-15T22:04:20.443 に答える