我遇到了类似于此处发布的问题:In SpriteKit presentScene Transition, won't work. However, presentScene does,但是问题的根源(从一个VC切换到另一个)似乎不适用。
这是来自我的GameViewController的相关代码,它在两个视图之间分割屏幕:UIView“HUD” - 占据屏幕的前八分之一 - 和一个SKView“gamePlayView”,占用剩余空间。控制器将首先在gamePlayView中呈现一个MenuScene(这样可以正常工作),该按钮具有可以播放游戏或转到设置的选项(可能会添加未来的选项)。到目前为止,我刚刚获得了开始按钮,它使用委托来调用GameViewController的“startNewRound”函数。
计划是让GameViewController保持对MenuScene,DiatonicIntervalScene(游戏)的引用,以及-in future-一个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()中的print语句将打印出来:
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之前的initiliazer,我发现场景更改和转换按计划进行:
gamePlayView = SKView(frame: CGRect(origin: gamePlayAreaOrigin, size: gamePlayAreaSize))
self.view.addSubview(gamePlayView)
with:
gamePlayView = self.view as! SKView
让它占据整个屏幕,所以显然是视图控制器的子视图而不是它的self.view使转换不起作用
答案 0 :(得分:0)
我偶然发现的解决方案(部分归功于this question)是覆盖我的viewcontroller' loadView()
并插入以下行
self.view = UIView(frame: UIScreen.main.bounds)
这似乎会导致其他一切落实到位。过渡现在按预期和预期运作,并且还没有任何意外后果!