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

C++ Box2D:在对象内创建b2BodyDef会导致错误,c++,constructor,cocos2d-iphone,box2d,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, b2S

我使用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=新b2BodyDef有什么区别吗

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

bodyDef->position.Set(134/PTM_RATIO, 33/PTM_RATIO);

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

不要使用
new
创建b2BodyDef。在中,您将看到b2BodyDef是一个结构,而不是一个类

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;
}
以下是创建b2BodyDef和任何其他Box2D结构的方法:

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

我认为在调用这个构造函数之前,需要添加更多的代码。例如,b2Shape*是如何创建的,您是否在某处删除了其中的任何指针,是否有超出范围的内容等。关于最后一部分(您的编辑),您是否在创建实体后偶然这样做?body def仅在调用CreateBody时使用,之后body不会查看它,因此需要使用body->SetTransform等body函数来更改它。构造函数之前的代码:CCSprite sprite=[CCSprite spriteWithFile:@“floor.png”rect:CGRectMake(0,0320,10)];CGPoint位置=ccp(200200);b2BodyType类型=b2_静态车身;b2BodyDef bodyDef=新b2BodyDef;bodyDef->type=type;bodyDef->position.Set(position.x/PTM_比率、position.y/PTM_比率);bodyDef->userData=sprite;b2PolygonShape*矩形=新的b2PolygonShape;矩形->设置框(320/PTM_比率*0.5f,20/PTM_比率);我的意图是在构造函数中执行bodyDef代码。我还应该询问错误发生在哪里。这有帮助吗?断言失败:(b2IsValid(bd->angularDamping)和&bd->angularDamping>=0.0f),函数b2Body,文件/用户/用户名/文件夹/Xcode/Application\u name/Application\u name/libs/Box2D/Dynamics/b2Body.cpp,第32行。看起来您传递给CreateBody的b2BodyDef中的值有些混乱。b2IsValid只检查值是否为NaN。不要害怕跟随Box2D源代码,它不完全是物理巫毒:)当然,我假设你没有将角度阻尼设置为负值。到目前为止,我看不到您显示的代码中有任何明显的问题,但在调用CreateBody之前,请检查您使用“new”创建的bodyDef指针是否未被删除或弄乱。这不起作用。当我以这种方式调用带有bodyDef变量的构造函数时,就像创建一个emtpty b2BodyDef(我猜这是因为我想要指向bodyDef的指针,而不是结构的副本)。在构造函数中执行此操作会产生与以前相同的错误。