重新启动 GameViewController/GameScene

Restartarting GameViewController/GameScene

我的游戏完成后,我 运行 宁 self.performSegueWithIdentifier("goToGameOver", sender: nil) 在我的游戏 ViewController 中,它通过

保存我的 GameScene
override func viewDidLoad()
{
    super.viewDidLoad()

    let scene = GameScene(size: view.bounds.size)
    let skView = view as! SKView
    skView.showsFPS = false
    skView.showsNodeCount = false
    skView.ignoresSiblingOrder = true
    scene.scaleMode = .ResizeFill
    scene.size = skView.bounds.size
    skView.presentScene(scene)
}

然后,在我的 GameOverViewController 当用户点击我的 playAgainButton 时 运行s self.dismissViewControllerAnimated(true, completion: nil)

但是然后它又回到了我的 GameViewController/GameScene,它没有重新加载并且处于与它离开时相同的状态...我怎样才能 "reinitialize" 或重新呈现 GameScene通过我的 ViewController 的 SKView?

这种问题也出现在我的商店中,当用户单击侧向箭头时,它会 "modally" 移动到另一个 ViewController 并且他们购买了我的游戏内货币,但是当他们单击我的后退时箭头和我 运行 self.dismissViewControllerAnimated(true, completion: nil) 我的 UILabel 等元素与 IBOutlet 链接,没有更新新的游戏内货币数量......如果我没记错的话,那是因为 viewcontroller/scene 没有重新加载。我该如何解决这两个问题?

您可以通过 Core Data 或使用 NSUserDefaults 保存用户状态以获得轻量级数据。当 GameScene 初始化时,GameScene 可以从本地存储加载状态。这也意味着您需要在解除分配 GameScene 时写入本地存储。此外,这也将解决游戏内货币问题。当用户添加了学分时,只需更新您的核心数据模型。

替代方法是使用委托模式。定义一个 protocolGameScene 符合 GameOverViewControllerGameScene 在呈现 GameOverViewController 时不会被释放,因为 GameOverViewController 会引用 GameScene。因此,GameScene 的实例将有一个由 GameOverViewController 持有的引用(以添加学分、更新标签等)。有关委托模式的示例,请查看我的回答

我建议使用第一种方法,因为使用持久性将在两次启动之间保存用户状态。