【发布时间】:2018-10-01 11:35:36
【问题描述】:
我遇到的问题似乎与此处发布的问题类似:In SpriteKit presentScene Transition, won't work. However, presentScene does,但问题的根源(从一个 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 使得转换不起作用
【问题讨论】:
-
你打印得太早了,过渡是一个动画,所以当然你仍然要打印旧场景,直到你达到交换发生的动画点
-
你的过渡没有发生,因为有些东西处于暂停状态,我猜是你的游戏场景,设置 isPaused = false
-
嘿@Knight0fDragon,谢谢!我尝试在 presentScene() 之后立即添加“gamePlayScene.isPaused = false”和“menuScene.isPaused = false”,以及在 DiatonicIntervalScene() 的 didMoveTo() 中(以“self.isPaused = false”的形式)。不幸的是,它似乎没有任何效果。
-
玩转它,Apple 喜欢搞砸暂停状态,所以你可能不得不在 didmoveto(view:) 中再次取消暂停
-
我尝试覆盖 gamePlayScene (DiatonicIntervalScene) 的
didMoveTo(view:)以放入self.paused = false,发现当我从那里打印出view.scene.name时,它仍然给我“菜单”
标签: sprite-kit transitions skscene skview