在Box2d UserData中保存NSObject的子类并将其检索回来?

时间:2011-07-24 16:27:50

标签: objective-c cocos2d-iphone box2d box2d-iphone

我有一个游戏实体类如下:

@interface CPlanet : NSObject {
    b2Body *planetBody;
}

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

@end

在init()方法中我创建了一个b2Body实例,并将CPlanet实例分配给其userdata,如下所示:

//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实例?

1 个答案:

答案 0 :(得分:1)

在您取消引用指针时已解除分配行星对象。你必须保留这个对象!

您可以将行星设为CCNode对象,并将其作为子项添加到图层中。然后它将被图层保留。