2012-05-14 49 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

相關問題