Saya memiliki simpul kamera yang diskalakan pada 1. Saat saya menjalankan game, saya ingin itu memperkecil skalanya (yaitu memperkecil) tetapi menjaga "lantai" di bagian bawah. Bagaimana cara menyematkan simpul kamera ke bagian bawah pemandangan dan secara efektif memperbesar "naik" (sulit dijelaskan). Jadi bagian bawah pemandangan tetap di bagian bawah tetapi sisanya diperkecil.

Saya telah mencoba SKConstraints tetapi tidak beruntung (saya cukup baru di 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]
        }


    }

Kemudian memanggil fungsi dengan:

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

(Ini adalah kode dari tutorial yang saya ikuti) Fungsi "setConstraints" adalah perpanjangan dari SKCameraNode

Saya tidak yakin ini akan memberi saya hasil yang benar, tetapi ketika saya menjalankan kode untuk menskalakan, itu hanya memperbesar dari tengah dan menunjukkan area sekitar file .sks adegan.

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

Ini adalah kode untuk menskalakan gameCamera

EDIT: Jawaban di bawah ini hampir seperti yang saya cari, ini jawaban saya yang diperbarui:

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
                       }
0
James Gardner 20 September 2019, 19:38

1 menjawab

Jawaban Terbaik

Anda tidak dapat menggunakan batasan karena ukuran skala Anda dinamis.

Alih-alih, Anda perlu memindahkan posisi kamera untuk memberikan ilusi bahwa itu hanya penskalaan dalam 3 arah.

Untuk melakukan ini, saya akan merekomendasikan membuat tindakan kustom.

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

               }

Apa yang dilakukan adalah membandingkan ketinggian baru kamera Anda dengan ketinggian lama, dan memindahkannya 1/2 jarak.

Jadi, jika tinggi Anda saat ini adalah 1, ini berarti kamera Anda melihat [-1/2 hingga 1/2] pada sumbu y. Jika tinggi skala baru Anda adalah 2, maka kamera Anda melihat [-1 hingga 1] pada sumbu y. Kita perlu menggerakkan kamera ke atas agar kamera melihat [-1/2 hingga 3/2], artinya kita perlu menambahkan 1/2. Jadi kita lakukan 2 - 1, yaitu 1, lalu pergi 1/2 jarak itu. Ini membuat yOffset 1/2 kami, yang Anda tambahkan ke kamera.

0
Knight0fDragon 23 September 2019, 18:28