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 へのポインターには、b2Body ではなく b2PolygonShape が含まれています (Xcode の変数ビューで確認できます)。ときどき (これも iPhone のみ)、ゲームが予期しない動作をすることがあります。更新メソッドにブレークポイントを設定したところ、Box2d ワールドのボディ リストにボディが 1 つしか含まれていないことに気付きました (ただし、以前の更新ではワールドには多くのボディが含まれており、現在の更新では視覚的に画面に表示されています)。

ゲームのコードを確認しましたが、エラーやそのような動作の理由が見つかりません。Xcode の Analyze 機能を使ってみたり、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 に答える