アップデート:
私の最初の投稿では、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);
}