在演示之前如何更改SKScene的位置?

时间:2019-02-05 22:27:37

标签: swift sprite-kit skscene iphone-xs-max

我正在尝试根据游戏正在运行的设备调整SKScene的位置。例如,由于iPhone XS Max的“顶部缺口”区域,我需要从SKScene高度中减去该高度并相应地定位场景。

这就是我计算safeAreaHeight中的高度AppDelegate并从场景高度中减去sceneHeight的方法:

    safeAreaHeight = UIApplication.shared.statusBarFrame.size.height
    sceneHeight -= safeAreaHeight

GameViewController中,我尝试重新定位SKScene,如下所示:

    if let view = self.view as! SKView? {
        // Load the SKScene from 'MainMenuScene.sks'
        if let scene = SKScene(fileNamed: "MainMenuScene") {
            // Set the scale mode to scale to fit the window
            scene.scaleMode = .aspectFit
            scene.size.height = sceneHeight
            scene.size.width = sceneWidth
            scene.position.y -= safeAreaHeight
            // Present the scene
            view.presentScene(scene)
        }

        view.ignoresSiblingOrder = true
        view.showsFPS = true
        view.showsNodeCount = true
    }

但是,我遇到了以下错误:

  

SKScene:设置SKScene的位置无效。

另外,我也尝试使用SKAction来移动SKScene的位置,然后收到以下错误消息:

  

SKScene:动画化SKScene的位置无效。

谢谢您的帮助。

1 个答案:

答案 0 :(得分:1)

好吧,我想出了实现方法,我在分享,以防它对别人有帮助。

AppDelegate内,您可以获得正确的安全区域值,并将其存储在单个实例中(在我的情况下为safeAreaHeight),以便在整个应用中进行访问。从场景高度(sceneHeight)中减去该量。

    let kWindow = UIApplication.shared.windows[0]
    safeAreaHeight = kWindow.safeAreaInsets.top + kWindow.safeAreaInsets.bottom
    screenHeight = screenRect.size.height - safeAreaHeight

在展示它之前,请不要忘记在GameViewController中调整sceneHeight

    if let view = self.view as! SKView? {
        // Load the SKScene from 'MainMenuScene.sks'
        if let scene = SKScene(fileNamed: "MainMenuScene") {
            // Set the scale mode to scale to fit the window
            scene.scaleMode = .aspectFit
            scene.size.height = sceneHeight
            scene.size.width = sceneWidth
            // Present the scene
            view.presentScene(scene)
        }

        view.ignoresSiblingOrder = true
        view.showsFPS = true
        view.showsNodeCount = true
    }

在加载的场景中,在这种情况下为MainMenuScene,您只需找到SKScene的子视图并通过减去其中心的safeAreaHeight来调整其Y位置

    guard let subView = self.view else { return }
    subView.center.y -= safeAreaHeight

PS .:请勿调整不同场景中的所有视图(即:GameScene,GameOverScene等)。调整后,它会保留在整个应用程序中。