2

それで、これがそれがどうなるかです。

私は現在、多くの障害物で構成される Cocos2d ゲームに取り組んでいます。こんな感じで10秒間隔で画面に障害物が1つ追加されていきます。

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];

arrayForObstaclesObstacles と MainPlayer が衝突しないかどうかもチェックし続けたいので、これらの障害物を に挿入します。

この機能を使ってチェックしています。

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

問題

問題は、特定のスコアに到達すると、障害物の 1 つが削除されることです。障害物の除去は、先入れ先出し (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 を超えるとクラッシュします。

アップデート

method に再度移動するとクラッシュが発生しcheckCollisionWithObstacleます。

これがスレッドルックです。

ここに画像の説明を入力

これがクラッシュする行です。

ここに画像の説明を入力

4

1 に答える 1

2

mainPlayer1.playerActive をセマフォとして使用して、 keepUpdatingScore メソッドの削除から checkCollisionWithObstacle ループのチェックをブロックしているようです (それらは非同期ですか?)。それらがそうであると仮定すると、checkCollisionWithObstacle でループが開始された後にコードが keepUpdatingScore に入ると、ループアクセスをブロックする方法は機能しません...走行距離は異なります。

于 2012-10-11T15:18:05.267 に答える