所以我发现了一些关于从Skscene过渡到uiviewcontroller的帖子,我得到了它的工作。每当用户赢得我的游戏级别或输掉时,就会调用此segue和unwind segue。
这适用于level1但是一旦我赢得level2,我就会
fatal error: unexpectedly found nil while unwrapping an Optional value
在我通过以下功能调用游戏的行
在我的游戏场景中我有:
class GameScene: SKScene, SKPhysicsContactDelegate {
//next level / try again segue
var viewController : GameViewController!
在GameViewController中我初始化这个属性
var currentLevel: Int!
override func viewDidLoad() {
super.viewDidLoad()
currentLevel = gameScene.currentLevel
if let scene = GameScene.level(currentLevel) {
// Configure the view.
let skView = self.view as SKView
skView.showsFPS = true
skView.showsNodeCount = true
/* Sprite Kit applies additional optimizations to improve rendering performance */
skView.ignoresSiblingOrder = true
/* Set the scale mode to scale to fit the window */
scene.scaleMode = .AspectFill
skView.presentScene(scene)
//initialize VC
scene.viewController = self
}
func gameOver() {
performSegueWithIdentifier("gameOver", sender: nil)
}
@IBAction func perpareForUnwind(unwindSegue: UIStoryboardSegue) {
}
最后我从gameScene的win()函数中调用gameOver
func newGame() {
view!.presentScene(GameScene.level(currentLevel))
}
func win() {
if (currentLevel < 3) {
currentLevel++
//present win view - with option to restart, next level, or home
}
println(currentLevel)
runAction(SKAction.sequence([SKAction.waitForDuration(2),
SKAction.runBlock(newGame)]))
self.viewController.gameOver() // this is the error!
}
所以这从level1到level2工作,但不能从level2到level3
因为viewDidLoad只被调用一次,它只是从lvl1初始化为lvl2然后变为nil。我怎样才能确保它每次都被初始化。我把这个设置代码放在viewDidLoad以外的其他地方吗?
答案 0 :(得分:0)
从1级到2级,你的var viewController不是nil,因为你在viewDidLoad上将它初始化为self。
但是,在你的下一个级别,viewController是nil,因为你的代码
//initialize VC
scene.viewController = self
仅在GameViewController中的viewDidLoad上执行。
您应该在场景初始化方法或didMoveToView中设置var viewController的值,以便为每个新场景设置它。