Бесконечный бегун переставляет игрока на одинаковую сложность независимо от соотношения сторон - PullRequest
0 голосов
/ 13 марта 2019

Я создаю бесконечный раннер для iphone в ландшафтном режиме, используя SpriteKit.Я настроил сцену так:

override func viewDidLayoutSubviews() {

    let scene = GameScene(size: CGSize(width: 812, height: 375))
    let skView = view as! SKView
    scene.backgroundColor = UIColor.red
    scene.scaleMode = .aspectFill
    skView.presentScene(scene)
    skView.showsFPS = true
    skView.showsNodeCount = true
    print("Screen Size: \(GlobalProperties.screenSize.width) x \(GlobalProperties.screenSize.height)")
    print("Scene Size: \(scene.size.width) x \(scene.size.height)")


} 

Я хотел бы расположить проигрыватель таким образом, чтобы между краем проигрывателя и правым краем экрана было одинаковое количество пикселей независимо от соотношения сторон,Это разумная практика для поддержания трудности между устройствами?У меня есть настройки макета как:

 override func didMove(to view: SKView) {

    let player = SKSpriteNode(texture: SKTexture(imageNamed: "CuteMelon"))
    player.anchorPoint = CGPoint(x: 0.5, y: 0.5)
    player.position = CGPoint(x: frame.width - 600, y: frame.midY)
    self.addChild(player)

    let rect = SKSpriteNode(color: .orange, size: CGSize(width: 550, height: 200))
    rect.anchorPoint = CGPoint(x: 1, y: 0.5)
    rect.position = CGPoint(x: frame.width-50, y: frame.height/2)
    self.addChild(rect)
}

Я добавил прямоугольник, чтобы увидеть, если в обоих случаях игрок был 600 пикселей справа (оставляя зазор 50px, чтобы убедиться, что он не сходит с края)

Результат выглядит следующим образом:

iPhone XR: https://imgur.com/y6OYHkK, который работает как положено

iPhone 8: https://imgur.com/nkrx5By, который не размещаетсяпрямоугольник в 50 пикселях от правой границы рамки.

Что мне нужно сделать, чтобы решить эту проблему, или я должен решить ее полностью иначе?Спасибо

1 Ответ

1 голос
/ 13 марта 2019

Просто выясните разницу между размером сцены и размером экрана и сдвиньте камеру на половину этого расстояния.Формула abs((sceneWidth - screenWidth * sceneHeight/screenHeight)/2) даст вам это.Это масштабирует экран до любой высоты сцены, затем вычитает две разницы из ширины и возвращает половину этого значения.

 override func didMove(to view: SKView) {
    let widthPadding = abs((self.frame.width - (UIScreen.main.bounds.width *  self.frame.height / UIScreen.main.bounds.height )) / 2)
    self.camera = self.camera ?? SKCameraNode()

    self.camera.position.x += widthPadding

    let player = SKSpriteNode(texture: SKTexture(imageNamed: "CuteMelon"))
    player.anchorPoint = CGPoint(x: 0.5, y: 0.5)
    player.position = CGPoint(x: frame.width - 600, y: frame.midY)
    self.addChild(player)

    let rect = SKSpriteNode(color: .orange, size: CGSize(width: 550, height: 200))
    rect.anchorPoint = CGPoint(x: 1, y: 0.5)
    rect.position = CGPoint(x: frame.width-50, y: frame.height/2)
    self.addChild(rect)
}
...