1

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

所以这就是我如何计算 akasafeAreaHeight中的高度AppDelegate并从场景高度 aka 中减去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 的位置没有效果。

感谢您的帮助。

4

1 回答 1

1

好吧,我想出了如何实现这一点,我正在分享以防它对其他人有所帮助。

在里面AppDelegate你会得到正确的安全区域值并将其存储在一个单例中(在我的例子中:),safeAreaHeight以便在整个应用程序中访问。从场景高度 ( sceneHeight) 中减去该数量。

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

sceneHeight在呈现之前不要忘记在 GameViewController 中进行调整:

    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 等)。一旦调整,它会保留在整个应用程序中。

于 2019-02-06T21:10:29.167 回答