2012-02-24 20 views
0

こんにちはすべて私は衝突の検出に問題があります。cocos2d:衝突検出が正しく機能しない

iは物体生まれ方法を選択しますときに、ランダムなオブジェクト

-(void)initObjects{ 

    int randomNumber = arc4random() % 5 + 1; 

    switch (randomNumber) { 
     case 1: 
      [self initEnemy]; 
      CCLOG(@"Random number 1"); 
      break; 

     case 2: 
      [self initJetpack]; 
      break; 

     case 3: 
      [self initWine]; 
      break; 

     case 4: 
      // [self initNight]; 
      break; 

     default: 
      CCLOG(@"no number"); 
      break; 
    } 

} 

を追加する第一の方法があり、意志の衝突がスプライトを削除検出した場合は、すべてのオブジェクトのメソッド

にコードを追加しました

[self schedule:@selector(collision) interval:1/60]; 

衝突方法:

-(void)collision { 
    if (CGRectIntersectsRect([_hero boundingBox], [_enemy boundingBox])) { 
     CCLOG(@"Enemy collision intercect"); 
     [self spriteMoveFinished:_enemy]; // It's method like [self removeChild:_enemy cleanup:YES]; 
     [self unschedule:@selector(collision)]; 
    } else if (CGRectIntersectsRect([_hero boundingBox], [_powerNight boundingBox])) { 
     CCLOG(@"PowerNight collision intercect"); 
     // the same up 
    } else if (CGRectIntersectsRect([_hero boundingBox], [_wine boundingBox])) { 
     CCLOG(@"Wine collision intercect"); 
     // the same up 
    } else if (CGRectIntersectsRect([_hero boundingBox], [_jetPack boundingBox])) { 
     CCLOG(@"Jetpack collision intercect"); 
     //the same up 
    } 
} 

は今面白いログ

Jetpackのは ワイン衝突intercectをinizializated(?????????)なぜワイン?

敵の未成年者 ジェットパックの衝突のintercect(?????)なぜjetPackですか?

しかし、時にはそれは大丈夫

敵が

私が間違っintercect 敵の衝突をinizializatedですか?

は、すべての最初の、全てのボディ歓声

答えて

0

まあありがとう、衝突をチェックしようとする前に、これらの各オブジェクトの存在を確認するのが良いでしょう。たとえば、

if (_jetPack) { // Check if jetPack exists 
    if (CGRectIntersectsRect([_hero boundingBox], [_jetPack boundingBox])) { 

    } 
} 

このようにすると、問題はより明確で安全になり、問題も解決する可能性があります。

+0

その良いアイデアをありがとうございましたが、動作しないと私は –

+0

コメントが通信するための正しい方法です私なしの評判のためのuを答えて傾けます。 )実際に質問やコメントのときに答えを書くのをやめてください;) – phlebotinum

+0

@GabrieleCarbonai:しかし、それは起こりそうもありません。おそらく、あなたのコードをもっと見せなければならないでしょう。 – Voldemort

0

はいオメガは正しいです、最初は私が間違いを犯しました。

スプライトがCCSpriteBatchNodeにあり、私はこのように呼び出す:私は今、私は多くの可能性を試してみて、私は衝突方法を変更するには、この(元のコード)

self.jetPack = [CCSprite spriteWithSpriteFrameName:@"jetpack-4.png"];  
_jetPack.position = ccp(480, randomNumber); 
[_batchNode addChild:_jetPack z:3 tag:3]; 

のように変更さ

[self addChild:nameSprite];

-(void)collision:(ccTime)dt andTag:(int)tag { 


if (_enemy){ 

    if (CGRectIntersectsRect(_enemy.boundingBox, _hero.boundingBox)) { 
     CCLOG(@"Enemy collision intercect"); 
     [self spriteMoveFinished:_enemy andTag:6]; 
     [self unschedule:@selector(collision)]; 
    } 
}// Continue with another collision 

私は試したかったDTH「タグ」が、

を動作しません生まれスプライトがinitメソッド内

[self schedule:@selector(collision:andTag:) interval:1/60]; 

衝突を呼び出すメソッドが呼び出されるメソッドは、乱数

 [self schedule:@selector(initObjects) interval:8]; 

とジェネレータオブジェクトスプライトには死ぬ時間があります

ログには常に同じです

スプライトが正しく生まれました。何らかの衝突があったときに、時にはうまく、時にはうまくいきません。

simulatoreは、スプライトを混乱させるが、奇妙であるようなものだ:

どのスプライトが_enemy衝突に入ることは可能であるならば、他のスプライトiは構造制御を持っている_jetPackであれば?

私はうまく説明したいと思います。