SKCameraNode and Aspect Ratio

113 Views Asked by At

I'm making a game and would like to create a universal scene size. Its height will be 2048, for example. The width of the level will be different depending on the level.

I want the height of the level (the play area) to fit completely on the screen of the device, regardless of the device whatever it is (iPhone, iPad).

GameViewController:

scene.scaleMode = .aspectFill

SKScene:

let cameraNode = SKCameraNode ()
let background = SKSpriteNode(imageNamed: "Background")



override func didMove(to view: SKView) {

    background.size = CGSize(width: 2048, height: 1536)
    background.position = CGPoint(x: 1024, y: 768)
    addChild(background)

    cameraNode.position = CGPoint(x: background.size.width / 2,
                                  y: background.size.height / 2)


    addChild(cameraNode)
    camera = cameraNode
}

override func didChangeSize(_ oldSize: CGSize) {
        let screenHeight = UIScreen.main.bounds.size.height
        let backgroundHeight = background.size.height
        let scaleFactor = backgroundHeight / screenHeight
        cameraNode.setScale(scaleFactor)
    }
1

There are 1 best solutions below

4
On

different iOS devices will have dramatically different sizes. hence you need to scale your camera based on the size of the screen and the size of your background image.

GameViewController

scene.scaleMode = .resizeFill

SKScene

class GameScene: SKScene {
    let cameraNode = SKCameraNode()
    let background = SKSpriteNode(imageNamed: "background")
    
    override func didMove(to view: SKView) {
        //set up camera note
        self.addChild(cameraNode)
        self.camera = cameraNode
        
        //add background image
        self.addChild(background)
    }
    
    override func didChangeSize(_ oldSize: CGSize) {
        //calculate scale factor based on screen size and image size
        let screen_height = UIScreen.main.bounds.size.height
        let background_height = background.size.height
        let scale_factor = background_height/screen_height
        cameraNode.setScale(scale_factor) //scale the camera accordingly
    }
}