2012-02-24 127 views
0

你好,我碰到一個碰撞檢測問題。cocos2d:碰撞檢測不能正常工作

我有誰添加隨機對象

-(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 inizializated 葡萄酒碰撞intercect(?????????)爲什麼酒?

敵人inizializated Jetpack collision intercect(?????)爲什麼jetPack ??

但有時這是確定

敵人inizializated 敵人碰撞intercect

在哪裏我錯了嗎?

謝謝每一個身體的歡呼聲

回答

0

嗯,首先,這將是很好的嘗試,檢查碰撞之前檢查每個對象的存在。例如:

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

    } 
} 

這樣,事情就更加清晰和安全,並且可能會解決您的問題。

+0

它的好主意,但不工作,我不能回答ü我沒有信譽 – 2012-02-24 20:32:23

+0

意見是溝通的正確方法。不要當它是一個真正的問題或評論寫答案;) – phlebotinum 2012-02-24 20:48:12

+0

@GabrieleCarbonai:但是,這是不可能的 - 這意味着你* *沒有初始化這些對象,當你不應該有。也許你將不得不向我們展示更多的代碼。 – Voldemort 2012-02-25 03:05:09

0

是的,你是對的,在第一個我犯了一個錯誤。

精靈在CCSpriteBatchNode和我這樣調用:

[self addChild:nameSprite];

我改變了這樣的(原代碼)

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

現在,我嘗試了很多可能性,我改變碰撞方法

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

我想試試wi嗞嗞「標籤」,但不起作用

哪裏出生的精靈調用init方法的碰撞

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

方法有調用的方法對象發生器,隨機數

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

的精靈有時間死亡

在日誌中它總是相同

正確地出生了這個精靈,並且當有一些碰撞有時是好的,有時沒有。

它像simulatore混淆精靈,但奇怪的是:

如果精靈是_jetPack我有結構控制的if-else怎麼可能是精靈進入_enemy碰撞?

我希望我解釋得很好。

謝謝