SKView presentScene 在转换时失败



我遇到了一个类似于这里发布的问题:在SpriteKit presentScene Transition中,无法正常工作。但是,presentScene 确实如此,但是问题的根源(从一个 VC 切换到另一个 VC)似乎并不适用。

这是我的GameViewController的相关代码,它将屏幕拆分为两个视图:UIView"HUD"(占据屏幕的前八分之一)和一个SKView"gamePlayView",占据剩余空间。控制器将首先在gamePlayView中显示一个MenuScene(这工作正常),其中将具有带有玩游戏或转到设置的选项的按钮(将来可能会添加选项)。到目前为止,我刚刚有了开始按钮,它使用委托来调用GameViewController的"startNewRound"函数。

该计划是让GameViewController保留对MenuScene,DiatonicIntervalScene(游戏)和将来的SettingsScene的引用,它将在gamePlayView中交换。所有这些都是 GameScene 类型,它继承自 SKScene,除了证明对 GameViewController 的引用和一些颜色值之外,不执行任何其他操作。

// Views
var hud: HUD!
var gamePlayView: SKView!
// Scenes
var menuScene: GameScene!
var gamePlayScene: (GameScene & TurnScene)!
override func viewDidLoad() {
// There's some code here to determine the respective sizes of 
// the areas and to create and add them
self.view.addSubview(hud)
self.view.addSubview(gamePlayView)
menuScene = MenuScene(size: gamePlayView.frame.size)
menuScene.gameController = self
gamePlayScene = DiatonicIntervalScene(size: gamePlayView.frame.size)
gamePlayScene.gameController = self
gamePlayView.presentScene(menuScene)
}
func startNewRound() {
print("BEFORE: gamePlayView.scene.name = ( gamePlayView.scene!.name!)n")
loadNewTurn()
let reveal = SKTransition.reveal(with: .down,
duration: 1)
gamePlayView.presentScene(gamePlayScene)
// gamePlayView.presentScene(gamePlayScene, transition: reveal)
print("AFTER: gamePlayView.scene.name = (gamePlayView.scene!.name!)")
}

我遇到的问题是这段代码完全按照我想要的方式工作,除非我尝试向 gamePlayView.presentScene 添加过渡(您可以在"startNewRound()"中看到修改后的注释行)。如果我改用该行,则转换永远不会发生,并且 gamePlayView 的场景属性永远不会更新。

如果没有过渡,startNewRound() 中的打印语句将打印出来:

BEFORE gamePlayView.scene.name = Menu
AFTER gamePlayView.scene.name = GameScene

而如果我使用包含过渡的 presentScene,则输出为

BEFORE gamePlayView.scene.name = Menu
AFTER gamePlayView.scene.name = Menu

这与 loadNewTurn() 无关,我尝试将其注释掉(即使我认为它不会做任何事情)。奇怪的是,gamePlayScene的didMoveTo()被调用了,尽管事实上过渡没有发生,场景也没有出现。

这就是我能想到的全部内容,感谢您抽出宝贵时间查看它,如果我遗漏了什么,请告诉我!

更新:我发现如果我替换gamePlayView以前的启动器,场景更改和过渡将按计划进行:

gamePlayView = SKView(frame: CGRect(origin: gamePlayAreaOrigin, size: gamePlayAreaSize))
self.view.addSubview(gamePlayView)

跟:

gamePlayView = self.view as! SKView

让它占据整个屏幕,所以显然是视图控制器的子视图而不是它的self.view使得过渡不起作用

我偶然发现的解决方案(部分归功于这个问题)是覆盖我的视图控制器的loadView()并插入以下行

self.view = UIView(frame: UIScreen.main.bounds)

这似乎会导致其他一切都水到渠成。过渡现在按预期和预期进行,并且到目前为止还没有出现任何意想不到的后果!

相关内容

最新更新