如何基于SKCameraNode实现跨设备游戏场景高度自适应?
游戏场景高度全屏适配方案(SpriteKit)
核心目标
让游戏场景高度完全适配任意iOS设备(iPhone/iPad)的屏幕高度,关卡宽度可根据需求自定义调整,保证视觉内容无拉伸、高度完全填充屏幕。
修改后的代码实现
GameViewController
scene.scaleMode = .resizeFill // 改为resizeFill,让场景跟随视图尺寸变化
SKScene
let cameraNode = SKCameraNode() let background = SKSpriteNode(imageNamed: "Background") // 定义场景设计基准高度(你想要的固定场景高度,比如2048) let designSceneHeight: CGFloat = 2048 override func didMove(to view: SKView) { // 背景尺寸基于设计高度,宽度按原图比例计算(或直接设置为关卡自定义宽度) let backgroundAspectRatio = background.texture!.size().width / background.texture!.size().height background.size = CGSize(width: designSceneHeight * backgroundAspectRatio, height: designSceneHeight) background.position = CGPoint(x: background.size.width / 2, y: background.size.height / 2) addChild(background) // 相机初始位置设为场景中心 cameraNode.position = CGPoint(x: background.size.width / 2, y: background.size.height / 2) addChild(cameraNode) camera = cameraNode // 初始调用一次缩放适配 adjustCameraScale(to: view.bounds.size) } override func didChangeSize(_ oldSize: CGSize) { // 视图尺寸变化时重新适配 adjustCameraScale(to: view!.bounds.size) } // 封装相机缩放逻辑 private func adjustCameraScale(to viewSize: CGSize) { // 计算缩放比例:设计高度 / 视图可用高度,保证高度完全适配 let scaleFactor = designSceneHeight / viewSize.height cameraNode.setScale(1 / scaleFactor) // 相机缩放反向,取倒数实现高度精准填充 }
关键说明
- scaleMode选择:用
.resizeFill让场景尺寸跟随SKView变化,避免系统自动裁剪或拉伸,完全由相机缩放控制显示内容。 - 缩放比例计算:基于SKView的实际可用高度(而非UIScreen),适配安全区、刘海屏等特殊情况,确保游戏区域完全填充屏幕高度。
- 关卡宽度自定义:可直接修改
background.size.width为任意关卡需要的宽度,相机仅控制高度适配,超出屏幕的宽度部分可通过相机平移实现横向滚动。 - 相机缩放方向:SpriteKit中相机缩放值大于1是缩小场景,小于1是放大场景,因此用
1/scaleFactor确保设计高度刚好填满视图高度。
内容的提问来源于stack exchange,提问作者Nexus S.
相关产品推荐
相关产品推荐

