2012-05-14 31 views
0

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

等内部构造不会改变物体的外观在屏幕上。

+0

我认为你需要添加更多的代码从您调用此构造函数之前。例如,b2Shape *是如何创建的,是否在某处删除了这些指针,是否超出了范围等等。关于最后一部分(您的编辑),是否在您创建任何机会后执行此操作?只有当你调用CreateBody时,才会使用body def,之后,body从不查看它,所以你需要使用body的函数,例如。 body-> SetTransform等来改变它。 – iforce2d

+0

来自构造函数之前的代码: 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

+0

我也应该问错误发生在哪里。 – iforce2d

回答

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; 
+0

这不起作用。当我这样做,并使用bodyDef变量调用构造函数时,就像创建一个emtpty b2BodyDef(我猜这是因为我想要一个指向bodyDef的指针,而不是结构的副本)。在构造函数中执行此操作与以前一样提供相同的错误。 – Jambaman

相关问题