Box2D:在对象内创建b2BodyDef会导致错误

时间:2012-05-14 12:05:30

标签: c++ constructor cocos2d-iphone box2d

我正在使用cocos2d与Box2D创建一个简单的iPhone游戏,并制作了包含LevelObject对象的GameLevel对象。

我想用构造函数

创建关卡对象
LevelObject(CGPoint position, b2BodyType type, b2Shape* shape, CCSprite *sprite);

我相信这包含了在屏幕上创建对象所需的所有信息。

LevelObject::LevelObject(CGPoint position, b2BodyType type, b2Shape* shape, CCSprite *sprite) : position(position), sprite(sprite) 
{
sprite.position = position;

bodyDef = new b2BodyDef;
bodyDef->type = type;
bodyDef->position.Set(position.x/PTM_RATIO, position.y/PTM_RATIO);
bodyDef->userData = sprite;

fixtureDef = new b2FixtureDef;
fixtureDef->shape = shape;
}

问题是,当我尝试运行它时,我收到SIGABRT错误。但是,如果我移动这个

bodyDef = new b2BodyDef;
bodyDef->type = type;
bodyDef->position.Set(position.x/PTM_RATIO, position.y/PTM_RATIO);
bodyDef->userData = sprite;
在构造函数外部

,并在构造函数中传入bodyDef:

LevelObject::LevelObject(b2BodyDef* bodyDef, CGPoint position, b2BodyType type, b2Shape* shape, CCSprite *sprite) : bodyDef(bodyDef), position(position), sprite(sprite)

一切都按预期运作。

我做错了什么?在构造函数内部或外部创建bodyDef = new b2BodyDef有什么不同吗?

编辑:我似乎无法在构造函数中编辑bodyDef对象。如果我在外面创建bodyDef,请将其作为参数,然后

bodyDef->position.Set(134/PTM_RATIO, 33/PTM_RATIO);
构造函数内部的

等不会改变对象在屏幕上的显示方式。

1 个答案:

答案 0 :(得分:0)

请勿使用new创建b2BodyDef。在Box2D API Reference中你会看到b2BodyDef是一个结构,而不是一个类。

这是你应该如何创建一个b2BodyDef和任何其他Box2D结构:

b2BodyDef bodyDef;
bodyDef.type = type;
bodyDef.position.Set(position.x/PTM_RATIO, position.y/PTM_RATIO);
bodyDef.userData = sprite;