SKView presentScene 因过渡而失败
SKView presentScene fails with transition
我遇到的问题似乎与此处发布的问题类似:In SpriteKit presentScene Transition, won't work. However, presentScene does,但问题的根源(从一个 VC 切换到另一个)似乎并不存在申请。
这是我的 GameViewController 中的相关代码,它将屏幕分成两个视图:一个 UIView "HUD" - 占据屏幕的前八分之一 - 和一个 SKView "gamePlayView",占据剩余的 space。控制器将首先在 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 使得转换不起作用
我偶然发现的解决方案(部分归功于 )是覆盖我的 viewcontroller 的 loadView()
并插入以下行
self.view = UIView(frame: UIScreen.main.bounds)
这似乎导致其他一切都到位。过渡现在按预期和预期进行,并且 - 到目前为止 - 没有任何意外后果!
我遇到的问题似乎与此处发布的问题类似:In SpriteKit presentScene Transition, won't work. However, presentScene does,但问题的根源(从一个 VC 切换到另一个)似乎并不存在申请。
这是我的 GameViewController 中的相关代码,它将屏幕分成两个视图:一个 UIView "HUD" - 占据屏幕的前八分之一 - 和一个 SKView "gamePlayView",占据剩余的 space。控制器将首先在 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)
这似乎导致其他一切都到位。过渡现在按预期和预期进行,并且 - 到目前为止 - 没有任何意外后果!