我正在尝试根据游戏正在运行的设备调整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的位置无效。
谢谢您的帮助。
答案 0 :(得分: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等)。调整后,它会保留在整个应用程序中。