Как изменить положение SKScene перед представлением?

Я пытаюсь настроить 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 ответ

Ну, я понял, как этого добиться, я делюсь на случай, если это поможет кому-то еще.

внутри 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 и корректируете его положение Y, вычитая safeAreaHeight в его центре

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

PS: не настраивайте все виды в разных сценах (например: GameScene, GameOverScene и т. Д.). После настройки он остается в приложении.

Другие вопросы по тегам