0

我使用 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);

构造函数内部的等等不会改变对象在屏幕上的外观。

4

1 回答 1

0

不要new用于创建 b2BodyDef。在Box2D API 参考中,您会看到 b2BodyDef 是一个结构,而不是一个类。

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

b2BodyDef bodyDef;
bodyDef.type = type;
bodyDef.position.Set(position.x/PTM_RATIO, position.y/PTM_RATIO);
bodyDef.userData = sprite;
于 2012-05-14T21:39:07.870 回答