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