Spritekit Camera Node масштабируется, но прикрепляет нижнюю часть сцены - PullRequest
0 голосов
/ 20 сентября 2019

У меня есть узел камеры, который масштабируется до 1. Когда я запускаю игру, я хочу, чтобы он уменьшал ее (т.е. уменьшал), но держал «пол» внизу.Как бы я мог прикрепить узел камеры к нижней части сцены и эффективно увеличить «вверх» (сложно объяснить).Таким образом, нижняя часть сцены остается внизу, а остальные уменьшаются.

Я попробовал SKConstraints, но мне не повезло (я совсем новичок в SpriteKit)

func setConstraints(with scene: SKScene, and frame: CGRect, to node: SKNode?) {
        let scaledSize = CGSize(width: scene.size.width * xScale, height: scene.size.height * yScale)
        let boardContentRect = frame

        let xInset = min((scaledSize.width / 2), boardContentRect.width / 2)
        let yInset = min((scaledSize.height / 2), boardContentRect.height / 2)
        let insetContentRect = boardContentRect.insetBy(dx: xInset, dy: yInset)

        let xRange = SKRange(lowerLimit: insetContentRect.minX, upperLimit: insetContentRect.maxX)
        let yRange = SKRange(lowerLimit: insetContentRect.minY, upperLimit: insetContentRect.maxY)

        let levelEdgeConstraint = SKConstraint.positionX(xRange, y: yRange)

        if let node = node {
            let zeroRange = SKRange(constantValue: 0.0)
            let positionConstraint = SKConstraint.distance(zeroRange, to: node)
            constraints = [positionConstraint, levelEdgeConstraint]
        } else {
            constraints = [levelEdgeConstraint]
        }


    }

, затем вызывая функцию с помощью:

gameCamera.setConstraints(with: self, and: scene!.frame, to: nil)

(Это был код из учебника, за которым я следовал) Функция "setConstraints" является расширением SKCameraNode

Я не уверен в этомвыдаст правильный вывод, но когда я запускаю код для масштабирования, он просто масштабируется от середины и показывает окружающую область файла .sks сцены.

gameCamera.run(SKAction.scale(to: 0.2, duration: 100))

Это код для масштабированияgameCamera

РЕДАКТИРОВАТЬ: Ответ ниже почти то, что я искал, это мой обновленный ответ:

let scaleTo = 0.2
let duration = 100
let scaleTop = SKAction.customAction(withDuration:duration){
                           (node, elapsedTime) in
            let newScale = 1 - ((elapsedTime/duration) * (1-scaleTo))
            let currentScaleY = node.yScale
            let currentHeight = node.scene!.size.height * currentScaleY
            let newHeight =  node.scene!.size.height * newScale
                           let heightDiff = newHeight - currentHeight
                           let yOffset = heightDiff / 2
                            node.setScale(newScale)
                           node.position.y += yOffset
                       }

1 Ответ

0 голосов
/ 21 сентября 2019

Вы не можете использовать ограничение, потому что размер вашей шкалы является динамическим.

Вместо этого вам нужно переместить положение камеры, чтобы создать иллюзию, что оно масштабируется только в 3 направлениях.

Для этого, Я бы порекомендовал создать пользовательское действие.

let scaleTo = 2.0
let duration = 1.0
let currentNodeScale = 0.0
let scaleTop = SKCustomAction(withDuration:duration){
                   (node, elapsedTime) in
                   if elapsedTime == 0 {currentNodeScale = node.scale}
                   let newScale = currentNodeScale - ((elapsedTime/duration) * (currentNodeScale-scaleTo))
                   let currentYScale = node.yScale
                   let currentHeight = node.scene.size.height * currentYScale
                   let newHeight =  node.scene.size.height * newScale
                   let heightDiff = newHeight - currentHeight
                   let yOffset = heightDiff / 2
                   node.scale(to:newScale)
                   node.position.y += yOffset

               }

Что он делает, это сравнивает новую высоту вашей камеры со старой высотой и перемещает ее на 1/2 расстояния.

Поэтому, если ваш текущий рост равен 1, это означает, что ваша камера видит [от -1/2 до 1/2] по оси Y.Если высота новой шкалы равна 2, то ваша камера видит [от -1 до 1] по оси Y.Нам нужно переместить камеру вверх, чтобы она видела [-1/2 до 3/2], то есть нам нужно добавить 1/2.Таким образом, мы делаем 2 - 1, то есть 1, затем идем на 1/2 этого расстояния.Это делает наш yOffset 1/2, который вы добавляете в камеру.

...