SKView presentScene失败了

时间:2018-04-20 17:29:12

标签: sprite-kit transitions skscene skview

我遇到了类似于此处发布的问题: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使转换不起作用

1 个答案:

答案 0 :(得分:0)

我偶然发现的解决方案(部分归功于this question)是覆盖我的viewcontroller' loadView()并插入以下行

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

这似乎会导致其他一切落实到位。过渡现在按预期和预期运作,并且还没有任何意外后果!