【问题标题】:SKView presentScene fails with transitionSKView presentScene 转换失败
【发布时间】: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


【解决方案1】:

我偶然发现的解决方案(部分感谢this question)是覆盖我的视图控制器的loadView() 并插入以下行

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

这似乎会导致其他一切都到位。过渡现在按预期和预期工作,并且没有 - 到目前为止 - 任何意外后果!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多