0

b2fixture から b2body にアクセスすると、EXC_BAD_ACCESS が発生します。これは、C++ で混合する ObjC 開発者であるため (box2d から始めたばかり)、C++ の知識が不足していることが原因である可能性があります。

Myb2dUserData.h
@interface Myb2dUserData : NSObject {
    MyContact *climbingHoldContact;  
}

@property (nonatomic, assign) MyContact *climbingHoldContact;

Myb2dUserData.mm
    b2Fixture *fixA = climbingHoldContact->fixtureA;
    b2Body *bodA = fixA->GetBody(); //EXC_BAD_ACCESS

b2ContactListener にclimingHoldContact を割り当てます。これは、次のコードからのほとんどのコピーです 。 cocos2d-tutorial-part-22

void MyContactListener::BeginContact(b2Contact* contact) {


    MyContact myContact = { contact->GetFixtureA(), contact->GetFixtureB() };
    _contacts.push_back(myContact);

    b2Fixture *fixtureA = contact->GetFixtureA();
    b2Body *bodyA = fixtureA->GetBody();
    Myb2dUserData *userDataA = (Myb2dUserData *)bodyA->GetUserData();
    bodyHoldUD.climbingHoldContact = &myContact;
4

1 に答える 1

0

この変数 は、myContactに対してローカルBeginContactです:

MyContact myContact = { contact->GetFixtureA(), contact->GetFixtureB() };

ただし、ここでは、将来の参照のためにポインターを保存しています。

bodyHoldUD.climbingHoldContact = &myContact;

BeginContact戻ったとき、myContact変数は存在しなくなり、後でアクセスしようとすると、そこにあったものは何でも別のもので上書きされたためfixtureA、コンピューターは言います。 これは、ローカル変数へのポインタを返すのと同じ問題です。EXC_BAD_ACCESS

MyContact作成した例では、sではなくベクトルに sを格納していることに注意してくださいMyContact*

climbingHoldContactメンバーをポインターにならないように変更するだけで、これを修正できるはずです。

于 2013-02-04T14:34:51.497 に答える