0

アップデート:

私の最初の投稿では、physicsBody プロパティのエラーが原因でクラッシュしたと思っていましたが、実際にはそうではありませんでした。

2 つのオブジェクトが衝突すると、ゲームが終了し、ゲーム オーバー画面が表示されるようになっています。ただし、ランダムなタイミングでアプリがクラッシュします。なぜこれを行うのかについてのパターンが見つかりません。初めて実行する場合もあれば、アプリがクラッシュする前に複数回再起動できる場合もあります。エラーが発生します:

'Attemped to add a SKNode which already has a parent: <GameOverLayer> name:'(null)' position:{0, 0} accumulatedFrame:{{0, 0}, {320, 568}}'

問題のコードは、このメソッドの最後の行です。

- (void) showGameOverLayer
{
    //Remove currently exising on pillars from scene and purge them
    for (int i = self.children.count - 1; i >= 0; i--)
    {
        SKNode* childNode = [self.children objectAtIndex:i];

        if(childNode.physicsBody.categoryBitMask == pillerCategory)
        {
            [childNode removeAllActions];
        }
    }
    [_flappyBird removeAllActions];
    _flappyBird.physicsBody.velocity = CGVectorMake(0, 0);
    self.physicsWorld.gravity = CGVectorMake(0, 0.0);
    _flappyBird.hidden = YES;

    _gameOver = YES;
    _gameStarted = NO;

    _dt = 0;
    _lastUpdateTimeInterval = 0;
    _lastSpawnTimeInterval = 0;

    [_startGameLayer removeFromParent];
    [self addChild:_gameOverLayer];
}

私は SpriteKit の使い方を学んでおり、Flappy Bird のようなゲームを作成するためのチュートリアルに従っているだけなので、これは私にとって比較的新しいことです。

パーツが表示されるすべての場所_gameOverLayer removeFromParent:

- (void) showStartGameLayer
{
    //Remove currently exising on pillars from scene and purge them
    for (int i = self.children.count - 1; i >= 0; i--)
    {
        SKNode* childNode = [self.children objectAtIndex:i];
        if(childNode.physicsBody.categoryBitMask == pillerCategory)
        {
            [childNode removeFromParent];
        }
    }

    //Move Flappy Bird node to center of the scene
    self.flappyBird.position = CGPointMake(self.backgroundImageNode.size.width * 0.5f, self.frame.size.height * 0.6f);

    [_gameOverLayer removeFromParent];

    _flappyBird.hidden = NO;
    [self flyingBird];
    [self addChild:_startGameLayer];
}

- (void) startGame
{
    _score = 0;

    _gameStarted = YES;

    [_startGameLayer removeFromParent];
    [_gameOverLayer removeFromParent];

    self.flappyBird.position = CGPointMake(self.backgroundImageNode.size.width * 0.3f, self.frame.size.height * 0.6f);

    //To have Gravity effect on Bird so that bird flys down when not tapped
    self.physicsWorld.gravity = CGVectorMake(0, -4.0);
}
4

0 に答える 0