我正在使用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);
构造函数内部的等不会改变对象在屏幕上的显示方式。
答案 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;