У меня есть узел камеры, который масштабируется до 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
}