我使用cocos2d与Box2D创建一个简单的iPhone游戏,并制作了包含LevelObject对象的GameLevel对象。Box2D:在对象内部创建b2BodyDef会导致错误
我想用构造
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);
等内部构造不会改变物体的外观在屏幕上。
我认为你需要添加更多的代码从您调用此构造函数之前。例如,b2Shape *是如何创建的,是否在某处删除了这些指针,是否超出了范围等等。关于最后一部分(您的编辑),是否在您创建任何机会后执行此操作?只有当你调用CreateBody时,才会使用body def,之后,body从不查看它,所以你需要使用body的函数,例如。 body-> SetTransform等来改变它。 – iforce2d
来自构造函数之前的代码: CCSprite * sprite = [CCSprite spriteWithFile:@“floor.png”rect:CGRectMake(0,0,320,10)]; CGPoint position = ccp(200,200); b2BodyType type = b2_staticBody; b2BodyDef * bodyDef = new b2BodyDef; bodyDef-> type = type; bodyDef-> position.Set(position.x/PTM_RATIO,position.y/PTM_RATIO); bodyDef-> userData = sprite; b2PolygonShape * rectangle = new b2PolygonShape; rectangle-> SetAsBox(320/PTM_RATIO * 0.5f,20/PTM_RATIO); 而我的意图是在构造函数中执行bodyDef代码。 – Jambaman
我也应该问错误发生在哪里。 – iforce2d