我是swift和Spritekit的初学者,我现在有两个UIViewController:LevelSelectViewController和GameViewController。后者应根据我在LevelSelectViewController场景中单击的按钮启动不同的SKScene。
LevelSelectViewController中有一个UI按钮,当单击它时会显示GameViewController,然后启动AdditionScene。
在AdditionScene中有一个SKSpriteNode,当点击它时,引用GameViewController并调用其backToLevel方法转到LevelSelectViewController。当满足某些条件时,场景也将加载新的AdditionScene。
通常,视图控制器和场景之间的转换按预期运行。
我的问题是,当我从GameViewController返回LevelSelectViewController然后重新进入GameViewController时,GameScene将不会在条件满足时加载新场景并且屏幕会在当前场景冻结。
我检查并发现新场景已初始化并加载,但屏幕只是卡住了。
此外,如果我在presentScene方法调用中省略了SKTransition,则解决了屏幕冻结问题,尽管它没有过渡动画。
现在我不知道是什么导致了这个错误以及如何解决它,除了报废不希望的SKTransition。
以下是转换到GameViewController并告诉它加载AdditionScene的方法:
@IBAction func toAdditionLevel(_ sender: UIButton) {
let viewController:GameViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "GameViewController1") as! GameViewController
viewController.gameType = "addition"
self.present(viewController, animated: true, completion: nil)
}
这是跳回levelSelectController的方法:
func backToLevel() {
let viewController:LevelSelectController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "levelSelectController") as! LevelSelectController
self.present(viewController, animated: true, completion: nil)
}
以下是我在GameViewController中加载AdditionScene的方法:
let scene = AdditionScene(size: skView.frame.size)
scene.game_delegate = self
scene.winningStreak = 0
scene.scaleMode = .aspectFill
skView.presentScene(scene)
以下是AdditionScenes:
之间的过渡 let newScene = AdditionScene(size: self.size)
newScene.game_delegate = self.game_delegate
newScene.winningStreak = self.winningStreak!+1
newScene.scaleMode = .aspectFill
print("before presenting scene")
let transition = SKTransition.moveIn(with: .right, duration: 1)
transition.pausesOutgoingScene = true
self.scene?.view?.presentScene(newScene, transition: transition)
如果你这样做的话 self.scene?.view?.presentScene(newScene)
屏幕冻结没有问题,但没有用于加载场景的动画。