我正在尝试根据游戏运行的设备调整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/