swift - 如何在演示前更改 SKScene 位置?

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

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

下面是我如何计算 AppDelegate 中的高度(又名 safeAreaHeight),并从场景高度(又名 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: Setting the position of a SKScene has no effect.

此外,我还尝试使用 SKAction 移动 SKScene 的位置,然后收到以下错误:

SKScene: Animating the position of a SKScene has no effect.

感谢您的帮助。

最佳答案

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

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 的 subview 并通过减去其中心的 safeAreaHeight 来调整其 Y 位置

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

PS:不要调整不同场景中的所有 View (即:GameScene、GameOverScene 等)。调整后,它会保留在整个应用程序中。

关于swift - 如何在演示前更改 SKScene 位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54544019/

相关文章:

ios - 使用 swift 在 iOS 中访问联系人详细信息

swift - 不同模拟时间的 SKEmitterNode

ios - 使用文件夹引用而不是组创建纹理图集

ios - 允许 SpriteKit 中的触摸传播

swift - 完全关闭 SKScene

swift - 在嵌套函数中使用闭包如何逃逸?

swift - 无法以编程方式调整约束

swift - 如何快速计算 Sprite 的数量

ios - 使用 SKScene 作为加载屏幕

Swift 为默认返回值生成错误