我的游戏完成后,我在我的GameViewController中运行self.performSegueWithIdentifier("goToGameOver", sender: nil)
,它通过
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时,它会运行self.dismissViewControllerAnimated(true, completion: nil)
然后它回到我的GameViewController / GameScene,它没有重新加载并且处于与之相同的状态......我怎样才能重新初始化"或通过我的ViewController的SKView重新呈现GameScene?
这种问题也出现在我的商店中,当用户点击它移动的侧箭头时,模态地"到另一个ViewController并且他们购买我的游戏币,但当他们点击我的后箭头并且我运行self.dismissViewControllerAnimated(true, completion: nil)
我的UILabel与IBOutlet链接的元素没有更新新的游戏币数量。如果我没错,那就是因为viewcontroller / scene没有重新加载。我如何解决这两个问题?
答案 0 :(得分:1)
您可以通过核心数据保存用户状态,也可以使用NSUserDefaults
保存轻量级数据。初始化GameScene
时,GameScene
可以从本地存储加载状态。这也意味着在解除分配GameScene
时需要写入本地存储。此外,这也将解决游戏币问题。只需在用户添加信用时更新您的Core Data模型即可。
替代方法是使用委托模式。定义protocol
GameScene
符合GameOverViewController
范围内的GameScene
。在提交GameOverViewController
时,GameOverViewController
不会被取消分配,因为GameScene
会引用GameScene
。因此,GameOverViewController
的该实例将具有{{1}}所持有的引用(以添加信用,更新标签等)。有关委托模式的示例,请查看我的答案here
我建议使用第一种方法,因为使用持久性将在启动之间保存用户状态。