2013-10-25 127 views
1

當兩個精靈同時被碰觸時,該應用會崩潰。當同時觸摸兩個精靈時碰撞(cocos2d-iphone)

-(void)addEnemy 
{ 
    enemy = [CCSprite spriteWithFile:@"enemy.png"]; 
    enemy.position = ccp(winsize.width/2, winsize.height/2); 
    [spriteSheet addChild:enemy]; 
    [spritetiles addObject:enemy]; //spritetiles is NSMutableArray 
} 

觸摸代碼

-(void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 
    CGPoint location = [self convertTouchToNodeSpace: touch]; 
    for (CCSprite *target in [spriteSheet children]) { 
    if (CGRectContainsPoint(target.boundingBox, location)) { 
     [target stopAllActions]; 
     [spriteSheet removeChild:target cleanup:YES]; 
     [spritetiles removeObject:target]; 
    } 
    } 
} 

如果我觸摸精靈中的任何一個,有沒有錯誤,但如果我在觸控小精靈(有時一些精靈的位置就在附近),應用程序會崩潰,在代碼行「if(CGRectContainsPoint(target.boundingBox,location)){」,那麼我該如何解決它?感謝

+0

不顯示你的代碼的一部分,如果你想幫幫我。 ccTouchesBegan中的「location」來自哪裏?addEnemy中的_bomb是什麼? – YvesLeBorg

+0

@YvesLeBorg對不起,我已經更新了代碼,請看看。 – yegomo

+0

hmmm ...小心修改數組([spriteSheet children]),同時迭代它。 – YvesLeBorg

回答

2

更新

使用reverseEnumerator,以便通過數組迭代時,您可能需要刪除要素作爲循環的一部分:

-(void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 
    CGPoint location = [self convertTouchToNodeSpace: touch]; 

    for (CCSprite *target in [spriteSheet.children reverseObjectEnumerator]) { 
     if (CGRectContainsPoint(target.boundingBox, location)) { 
      [target stopAllActions]; 
      [spriteSheet removeChild:target cleanup:YES]; 
      [spritetiles removeObject:target]; 
     } 
    } 
} 
+0

非常感謝你。 – yegomo

+0

@yegomo不要忘了給出答案太贊同一個適當的謝謝:) – YvesLeBorg

+1

不,不,實際上,你真正需要的是使用reverseEnumerator。反向枚舉時移除數組中當前迭代的對象是合法的。 – LearnCocos2D