由于从NSMutableArray中删除了像CCSprite这样的元素而导致崩溃

时间:2012-10-11 14:17:33

标签: iphone cocos2d-iphone nsmutablearray ccsprite removechild

所以,这是怎么回事。

我目前正在研究Cocos2d游戏,其中包含许多障碍。屏幕上会以10秒的间隔添加一个障碍物。

ObstacleSprite* newObstacle = [ObstacleSprite spriteWithFile:@"Obstacle.png" rect:CGRectMake(0, 0, 20, 20)];
            newObstacle.position = ccp(mainPlayer1.position.x,10);
[self addChild:newObstacle];

[self.arrayForObstacles addObject:newObstacle];

现在,我将这些障碍插入arrayForObstacles,因为我还想继续检查障碍物和主要人物是否不碰撞。

我在这个功能的帮助下检查它。

- (void) checkCollisionWithObstacle
{
    if(mainPlayer1.playerActive)
    {
        for(int  i = 0; i < [self.arrayForObstacles count]; i++)
        {
            ObstacleSprite* newObstacle = [self.arrayForObstacles objectAtIndex:i];
            if(newObstacle != nil)
            {
                if(CGRectIntersectsRect([mainPlayer1 boundingBox], [newObstacle boundingBox]))
                {
                    mainPlayer1.livesLeft--;
                }
            }
        }
    }
}

问题

问题是当我达到某个分数时,其中一个障碍会被删除。去除障碍的方式与先进先出(FIFO)模式相同。所以,为了删除障碍,我写下面的方法:

- (void) keepUpdatingScore
{
    //update new score
    mainPlayer1.score+=10;
    //remove obstacle when score increases by 5k
    if(mainPlayer1.score > 5000 && mainPlayer1.score > 0)
    {        
        mainPlayer1.playerActive = NO;

        if([self.arrayForObstacles count] > 0)
        {            
            CCLOG(@"count is %d",[self.arrayForObstacles count]);
            ObstacleSprite* newObstacle = [self.arrayForObstacles objectAtIndex:0];
            [self.arrayForObstacles removeObjectAtIndex:0];
            [self removeChild:newObstacle cleanup:YES];

            CCLOG(@"count is %d",[self.arrayForObstacles count]);
        }

        mainPlayer1.playerActive = YES;

    }    
    else
    {

    }

当得分超过5000分时崩溃!

更新

当它再次进入方法checkCollisionWithObstacle时发生崩溃。

这是THREAD Look。

enter image description here

这是崩溃的线。

enter image description here

1 个答案:

答案 0 :(得分:2)

您似乎使用mainPlayer1.playerActive作为信号量来阻止从keepUpdatingScore方法中的删除检查checkCollisionWithObstacle循环(它们是异步的吗?)。如果代码在checkCollisionWithObstacle中开始循环后输入keepUpdatingScore,那么阻止循环访问的方式将无法正常工作......您的里程会有所不同。