我使用 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);
构造函数内部的等等不会改变对象在屏幕上的外观。