0

我使用 Cocos2d v 1.0.1 和 Box2d(cocos2d + box2d 模板)创建 iOS 应用程序。 在 iPad 上,我的应用程序运行 良好在 iPhone 4,4s(ios 版本 5.0.1、6.0,未在其他 iPhone/固件上测试)我在游戏开始时获得 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 版本和其他一些东西。我暂时无法解决这个问题。
我应该使用什么方法来调试此崩溃?
我能做些什么来研究和解决它?

4

1 回答 1

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]];

存储在 NSValue 中的指针 b 在 CCCallblock 执行时可能无效,这会导致内存错误。

我用这个代码替换了

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

然后在我的 update: 方法中清理 self.bodiesThatHeroCollidedWith 数组:

for (NSValue *body in self.bodiesThatHeroCollidedWith) {
    b2Body *b = (b2Body *)[body pointerValue];
    b->SetUserData( NULL );
    world->DestroyBody( b );
}
[self.bodiesThatHeroCollidedWith removeAllObjects];
于 2012-11-30T09:29:38.967 回答