2

これまでは、xCode の [再生] ボタンを押すたびに新しいゲームが開始される Sprite Kit ゲームに取り組んできました。今、ゲームをリセットして新しいゲームを開始する「新しいゲーム」ボタンをゲーム内に実装しようとしています。

古いゲーム シーンを確実に削除し、ダングリング リファレンスがないことを確認するには、どのような手順を踏む必要がありますか?

  • シーン内で何らかの手動クリーンアップを行う必要はありますか? (古い viewDidUnload のように) それとも ARC がすべて処理するのでしょうか?
  • シーン内からスーパービューに追加したビュー コントローラー ビューを明示的に削除する必要がありますか?
  • ゲームのリセットに役立つ組み込みメソッドはありますか?

今まで使っていたのはこちら。

-(void)viewWillLayoutSubviews
{
    [super viewWillLayoutSubviews];

    //set the view only once, because this method will be called again on rotation
    if(!self.kkView.scene)
    {
        landscapeSize = self.kkView.bounds.size;

        self.kkView.showsFPS = NO;
        self.kkView.showsNodeCount = NO;
        self.kkView.showsDrawCount = NO;

        MyScene * gameScene = [MyScene sceneWithSize:landscapeSize];
        gameScene.scaleMode = SKSceneScaleModeAspectFill;

        IntroScene * scene = [IntroScene sceneWithSize:landscapeSize];
        scene.gameScene = gameScene;

        scene.scaleMode = SKSceneScaleModeAspectFill;
        [self.kkView presentScene:scene];
    }
}
4

1 に答える 1

3

ARC は、オブジェクトの作成 (+sceneWithSize: など) のクリーンアップを処理する必要があります。また、SKScene 全体を削除する場合は、接続されているすべてのノードとアクションに対してクリーンアップが行われると思います (おそらく -willMoveFromView: メソッドで)。

ただし、シーンを保持し、シーン サブクラス自体の内部のノードとアクションをリセットする場合は、シーンのセットアップ部分の前に次のようなことを行うことができます (-didMoveToView: メソッドまたは独自のセットアップ メソッドのいずれかで)。 ):

[self removeAllChildren];
[self removeAllActions];
...
[self addChild:node];
etc
于 2014-01-20T05:35:09.087 に答える