Sprite kit SKView presentScene转换失败

Sprite kit SKView presentScene转换失败,sprite-kit,transitions,skscene,skview,Sprite Kit,Transitions,Skscene,Skview,我遇到了一个类似于这里发布的问题:,但是问题的根源(从一个VC切换到另一个VC)似乎并不适用 下面是我的GameViewController中的相关代码,它将屏幕分为两个视图:一个UIView“HUD”(占据屏幕的上八分之一)和一个SKView“gamePlayView”(占据剩余空间)。控制器将首先在gamePlayView中显示一个MenuScene(这很好),其中将有按钮,可以选择玩游戏或进入设置(将来可能会添加选项)。到目前为止,我只得到了开始按钮,它使用一个委托来调用GameViewC

我遇到了一个类似于这里发布的问题:,但是问题的根源(从一个VC切换到另一个VC)似乎并不适用

下面是我的GameViewController中的相关代码,它将屏幕分为两个视图:一个UIView“HUD”(占据屏幕的上八分之一)和一个SKView“gamePlayView”(占据剩余空间)。控制器将首先在gamePlayView中显示一个MenuScene(这很好),其中将有按钮,可以选择玩游戏或进入设置(将来可能会添加选项)。到目前为止,我只得到了开始按钮,它使用一个委托来调用GameViewController的“startNewRound”函数

该计划是让GameViewController保留对MenuScene、DiatonicIntervalScene(游戏)的引用,以及(将来)一个SettingsScene的引用,它将在gamePlayView中交换这些引用。所有这些都是GameSecene类型,它继承自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()无关,我已经尝试过对它进行注释(即使我认为它不会起任何作用)。同样奇怪的是,GamePlaySecene的didMoveTo()被调用,尽管事实上没有发生转换,场景也没有出现

这就是我能想到的全部内容,谢谢你花时间查看,如果我遗漏了什么,请告诉我

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

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

gamePlayView = self.view as! SKView

使其占据整个屏幕,因此显然是视图控制器的子视图而不是其自身。视图使转换不起作用

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

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

这似乎导致其他一切都到位。过渡现在按照预期和预期进行,目前还没有任何意外后果

你打印得太早了,过渡是一个动画,所以当然你仍然要打印旧场景,直到你达到了动画的交换点。你的过渡没有发生,因为有些东西处于暂停状态,我猜是你的游戏场景,设置isPaused=false@Knight0fDragon,谢谢!我尝试在presentScene()之后立即添加“gameplaysecene.isPaused=false”和“menuScene.isPaused=false”,以及在DiatonicIntervalScene()的didMoveTo()中添加(以“self.isPaused=false”的形式)。不幸的是,它似乎没有任何效果。玩转它,苹果喜欢改变暂停状态,所以你可能不得不在didmoveto(视图:)中再次取消暂停。我尝试覆盖GamePlaySecene(DiatonicIntervalScene)的
didmoveto(视图:)
,放入
self.paused=false
,当我从那里打印出
view.scene.name
时,它仍然给我“菜单”