2012-05-08 5 views
0

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

は、私は私のプレーヤーのクラスにジャンプアクションを実装する方法である:

- (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; 
} 

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

私は物理学の世界の更新方法から問題が発生したと思います。
私はジャンプアクションを別の方法で実装したので、ワールド - ステップメソッドの後にジャンプするだけです([プレーヤージャンプ])、EXC_BAD_ACCESSは表示されません。

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

答えて

0

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

+0

これは実際には別のものでした。私はタッチディスパッチャーのremoveDelegateを呼び出していないので、私はゲームシーンを再開したときにジャンプメソッドを呼び出すことになりました...だからジャンプはもはや問題ではありません。さらに、デリゲートを削除しないと、deallocメソッドが呼び出されなくなりました。だから私は最初のジャンプの問題がこれを指摘してくれてうれしいです。 – florian

関連する問題