我是 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)
这是 AdditionScene 之间的过渡:
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)
卡屏没有问题,但是没有加载场景的动画。
这是我发现成功的代码=
func presentScene(_ theScene: SKScene) {
theScene.scaleMode = .resizeFill
if let skView = self.view as? SKView {
skView.ignoresSiblingOrder = true
skView.showsFPS = true
skView.showsNodeCount = true
#if os(iOS)
let theTransition = SKTransition.doorway(withDuration: 2.0)
skView.presentScene(theScene, transition: theTransition)
#elseif os(tvOS)
skView.presentScene(theScene)
#endif
}
} // presentScene
FWIW,#if 子句的原因是因为我在 3
SKScenes
之间切换。对于 os(tvOS)
,我依靠全局 var
来保留其在多个 SKScenes
之间的值。我发现,除非我放弃 SKTransition
而选择 os(tvOS)
,否则当用户快速按下 GamePad Controller
上的相应按钮时,不会发生这种保留。