Как изменить положение 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 и т. Д.). После настройки он остается в приложении.