0

私はcocos2dとbox2dでゲームを開発しています。問題は、プレーヤーをジャンプさせるために画面をタッチすると、アプリがクラッシュすることがあることです。

Playerクラスにジャンプアクションを実装した方法は次のとおりです。

- (void)jump
{
if (numFootContacts > 0)
    {
        isJumping = YES;
        b2Vec2 impulse = b2Vec2(0.0f, 100.0f);
        b2Vec2 point = body->GetWorldCenter();      // this line sometimes triggers an EXC_BAD_ACCESS for the body pointer.

        body->ApplyLinearImpulse(impulse, point);
    }
}

numFootContactsを使用すると、自分が地上にいるかどうかを知ることができます。

そして私のゲームシーンでは、これ(および他の関連性のないもの)があります:

- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
{
    [player jump];
    return YES;
}

私が他の人々のコードで見たものから、これはジャンプアクションを実装するための一般的な方法です。

問題は物理学の世界の更新方法にあると思います。
別の方法でジャンプアクションを実装したため、world-> Stepメソッドの後でのみジャンプ([player間のジャンプ])し、EXC_BAD_ACCESSを取得しません。

それで、誰かがすでにこの種の問題を抱えていますか?
ボディがロックされているため、コールバック中にボディを削除できないという「問題」と非常によく似ていると思います。ここでの問題は、世界が更新されているときに私がちょうどいいジャンプをするかもしれないということです。バグを再現するのはちょっと難しいです(10回に1回)。
私が間違っているかどうか教えてください。

4

1 に答える 1

0

[player jump]タッチ処理メソッドから呼び出していて、アプリがマルチスレッド化されていない場合、関数の実行ccTouchBegan中に呼び出すことはできません。Stepあなたが得ている理由はあなたがEXC_BAD_ACCESSどこかで無効なポインタにアクセスしているということです。それはplayerbodyまたは他の何でもかまいません。

于 2012-05-08T17:51:13.137 に答える