【问题标题】:How to change SKScene position before presenting?如何在演示前更改 SKScene 位置?
【发布时间】:2019-02-05 22:27:36
【问题描述】:

我正在尝试根据游戏运行的设备调整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:设置 SKScene 的位置无效。

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

SKScene:动画 SKScene 的位置没有效果。

感谢您的帮助。

【问题讨论】:

  • 我将场景调整为视图控制器的视图和位置节点,以避免必要时出现缺口(或潜在的其他非安全区域)。有没有理由这不适用于您的情况?如果您调整安全区域的场景,您希望在缺口旁边显示什么?我有点喜欢天空或其他背景填充那个空间。
  • @JKaz 我没有尝试调整大小以查看控制器的视图。视图控制器的视图是否等于“安全区域”?我只希望该区域是纯黑色。我不会使用那个区域。
  • vc 的视图是屏幕,而不仅仅是安全区域。安全区域插图是视图的属性。在我见过或使用 skScene 的地方,场景充满了屏幕,各个控件/节点/等都位于安全区域内,避免了看起来与安全区域不同的非安全区域。我认为建议不要单独为非安全区域着色,但快速浏览了一下,我没有找到来源。

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


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-14
    • 2010-12-07
    • 2016-11-06
    相关资源
    最近更新 更多