2012-11-30 70 views
0

我使用Cocos2d v 1.0.1和Box2d(cocos2d + box2d模板)創建iOS應用程序。 在iPad上我的應用程序工作正常 在iPhone 4,4s(ios版本5.0.1,6.0,未在其他iPhone /固件上測試過)我在遊戲開始時(在短暫播放後)獲得了EXC_BAD_ACCESS。cocos2d中的box2d與EXC_BAD_ACCESS崩潰。如何調試?

myActor.position = CGPointMake(b->GetPosition().x * PTM_RATIO, b->GetPosition().y * PTM_RATIO ); 

我分析了b和Box2d世界的狀態,看起來世界的遺體列表已損壞。 指向b的指針包含b2PolygonShape,而不是b2Body(我在Xcode的變量視圖中看到)。 有時(也只在iPhone上),我的遊戲開始表現出色。 我在我的更新方法中設置了斷點,並意識到Box2d世界的身體列表僅包含一個身體(但在之前的更新世界中包含許多身體,並且在視覺上它們在當前更新的屏幕上)。

我檢查了我的遊戲代碼,並且找不到錯誤或此類行爲的原因。 我試着使用Xcode的分析功能,更改Box2d版本和其他一些東西。 我現在無法解決這個問題。
我應該用什麼方法來調試這次崩潰?
我能做些什麼來研究和解決它?

回答

1

我發現了錯誤,通過從我的應用程序中排除部分與Box2d相關的代碼。 在下面的代碼

CCDelayTime *destroyDelay = [CCDelayTime actionWithDuration:0.001]; 
    CCCallBlock *destroyBlock = [CCCallBlock actionWithBlock:^{ 
     b2Body * b = (b2Body *)[bodyVal pointerValue]; 
     b->SetUserData(NULL); 
     [self world]->DestroyBody(b); 
    }]; 
    [self runAction: [CCSequence actions:destroyDelay,destroyBlock, nil]]; 

指針B,存儲在NSValue,執行CCCallblock時可能是無效的,並且這導致存儲器錯誤。

我換成這個代碼

NSValue *bodyVal = [NSValue valueWithPointer: body ]; 
[self.bodiesThatHeroCollidedWith addObject: bodyVal ]; 

,然後在我的更新:我的方法清洗self.bodiesThatHeroCollidedWith陣列:

for (NSValue *body in self.bodiesThatHeroCollidedWith) { 
    b2Body *b = (b2Body *)[body pointerValue]; 
    b->SetUserData(NULL); 
    world->DestroyBody(b); 
} 
[self.bodiesThatHeroCollidedWith removeAllObjects]; 
+0

現在我有一個類似的問題,我假設原因是線程。在一個序列或其他類型的塊中移除來自世界的物品(比如銷燬物等)可能是「危險的」。在主更新循環結束/開始時只刪除這些內容或執行這些操作可能會更好。因此,保留一個要刪除的東西列表,並在更新結束時檢查它。有點像你做的事情。 – Jonny