碰撞检查问题

问题描述:

因此,在我的游戏中,我有物品从屏幕顶部落下,当玩家(另一个精灵)抓住物品时,物品消失并将其添加到柜台。碰撞检查问题

这是我的碰撞检测方法

//WHEN THE THINGS COLLIDE, THEY DISSAPEAR 
- (void)update:(ccTime)dt { 
CGSize winSize = [[CCDirector sharedDirector] winSize]; 

NSMutableArray *targetsToDelete = [[NSMutableArray alloc] init]; 
for (CCSprite *target in _targets) { 
    CGRect targetRect = CGRectMake(
             target.position.x - (target.contentSize.width/2), 
             target.position.y - (target.contentSize.height/2), 
             target.contentSize.width, 
             target.contentSize.height); 
    BOOL playerHit = FALSE; 
     CGRect playerRect = CGRectMake(
             _Banker.position.x - (_Banker.contentSize.width/2), 
             _Banker.position.y -  (_Banker.contentSize.height/2), 
             _Banker.contentSize.width, 
             _Banker.contentSize.height); 

     if (CGRectIntersectsRect(playerRect, targetRect)) { 
      //[targetsToDelete addObject:target]; 
      playerHit = TRUE; 
       [targetsToDelete addObject:target]; 

      break; 

    } 

    for (CCSprite *target in targetsToDelete) { 
     [_targets removeObject:target]; 
     [self removeChild:target cleanup:YES]; 

     _targetsDestroyed++; 
     [_label setString:[NSString stringWithFormat:@""]]; 
     if (_targetsDestroyed > 30) { 
      GameWinScene *gameWinScene = [GameWinScene node]; 
      _targetsDestroyed = 0; 
      [[CCDirector sharedDirector] replaceScene:gameWinScene]; 
     } else{ 
      NSString *killcounttext = [NSString stringWithFormat:@"Catches: %i",  _targetsDestroyed]; 
      self.label = [CCLabelTTF labelWithString:killcounttext fontName:@"Zapfino"  fontSize:20]; 
      _label.color = ccc3(225,225,225); 
      _label.position = ccp(winSize.width * 0.20,winSize.height * 0.92); 
      [self addChild:_label]; 
     } 
    } 

    if (targetsToDelete.count > 0) { 
     [targetsToDelete addObject:target]; 
    } 
    [targetsToDelete release]; 
} 
} 

我添加了一个CCLOG,以确保被添加的目标在我的下一个方法的话,我删除targetstodelete任何东西,因为targetstodelete。 CCLOG证实目标正在被添加,但它们并未被删除。

这是我的删除方法

for (CCSprite *target in targetsToDelete) { 
     [_targets removeObject:target]; 
     [self removeChild:target cleanup:YES]; 

     _targetsDestroyed++; 
     [_label setString:[NSString stringWithFormat:@""]]; 
     if (_targetsDestroyed > 30) { 
      GameWinScene *gameWinScene = [GameWinScene node]; 
      _targetsDestroyed = 0; 
      [[CCDirector sharedDirector] replaceScene:gameWinScene]; 
     } else{ 
      NSString *killcounttext = [NSString stringWithFormat:@"Catches: %i", _targetsDestroyed]; 
      self.label = [CCLabelTTF labelWithString:killcounttext fontName:@"Zapfino" fontSize:20]; 
      _label.color = ccc3(225,225,225); 
      _label.position = ccp(winSize.width * 0.23,winSize.height * 0.92); 
      [self addChild:_label]; 
     } 
    } 

任何帮助表示赞赏,但请不要随便说“去学习Objective-C”像有些人那样:/

在你的代码写了这线,

if (targetsToDelete.count > 0) { 
     [targetsToDelete addObject:target]; 
    } 

我不明白为什么你加这个,所以我认为这是错误,请检查否则解释为什么你添加此代码..

+0

我这样做是因为在接下来的方法中,我检查CCSprite目标是否位于targetsToDelete中,如果是,则从场景中移除目标 – tyler53 2012-07-24 17:12:08

+0

在此循环中,您获得目标,对于(CCSprite * target in targetsToDelete) {_targets removeObject:target]; [self removeChild:target cleanup:YES]; .......然后再次将目标添加到targetsToDelete,但没有代码可以从targetsToDelete中移除目标并持续释放[targetsToDelete release]; ,那么if(targetsToDelete.count> 0)是什么意思{targetsToDelete addObject:target]; } – Devang 2012-07-25 07:36:44