You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 14:20:19