0

私は次のようなゲームエンティティクラスを持っています:

@interface CPlanet : NSObject {
    b2Body *planetBody;
}

-(void)init;
-(void)syncWithPhysics;

@end

init() メソッドで、次のように b2Body インスタンスを作成し、CPlanet インスタンスをそのユーザーデータに割り当てます。

//creating the physics
b2BodyDef bodyDef;
bodyDef.type=b2_dynamicBody;
bodyDef.userData=self;
planetBody=world->CreateBody(&bodyDef);

私の CCLayer インスタンスでは、次のようにこのオブジェクトを取得しようとしています。

for(b2Body* b =world->GetBodyList();b;b=b->GetNext())
{
    void *udata=b->GetUserData();
    if(udata!=NULL)
    {
       CCLOG(@"Some udata %d",udata);
       CPlanet *planet=(CPlanet*)udata;
       // [planet syncWithPhysics];   <---- here programm crashes ???

     }
}

しかし、「[planet syncWithPhysics]」という行は、エラーでアプリケーションをクラッシュさせます

プログラム受信信号: 「EXC_BAD_ACCESS」。

取得した CPlanet インスタンス (udate) のメモリ アドレスが同じオブジェクトであることを確認しました。

任意のヒント?これは、Box2D が C++ であり、Objective-C インスタンスを使用している必要がありますか?

4

1 に答える 1

1

ポインターを逆参照した時点で、planet オブジェクトの割り当てが解除されています。オブジェクトを保持する必要があります !

惑星を CCNode オブジェクトにして、レイヤーに子として追加することができます。その後、レイヤーによって保持されます。

于 2011-07-24T17:28:18.027 に答える