Как изменить положение SKScene перед представлением? - PullRequest
0 голосов
/ 06 февраля 2019

Я пытаюсь настроить положение SKScene в зависимости от устройства, на котором запущена игра.Например, из-за области «на высшем уровне» iPhone XS Max мне нужно вычесть эту высоту из SKScene высоты и соответствующим образом расположить сцену.

Итак, вот как я вычисляю высоту ака safeAreaHeight в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 не имеет никакого эффекта.

Спасибо за помощь.

1 Ответ

0 голосов
/ 07 февраля 2019

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

Внутри 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 и т. д.) После настройки он остается в приложении.

...