SKCameraNode Tertinggal Saat Pemain Bergerak

Saat ini saya mencoba agar Kamera saya mengikuti "bola" pemain saya setiap kali pemain dipindahkan. Saya telah mengatur posisi Kamera untuk berpindah ke posisi x bola setiap kali bola dipindahkan, namun karena alasan tertentu, saat bola dipindahkan dengan cepat, SKCameraNode mengalami gangguan dan tersendat seolah-olah mencoba mengejar posisi simpul. Saya telah membaca bahwa itu karena fisika berjalan setelah pembaruan sebenarnya (), tetapi saya tidak tahu cara mengatasi masalah tersebut. Apakah ada cara untuk memperbaiki masalah ini?

CATATAN: Saya tidak ingin kamera selalu terpusat pada "bola", melainkan menunda sedikit saat kamera mengikuti bola tersebut, untuk memberikan kesan bergerak bebas. (jika itu masuk akal)

    import SpriteKit

    class GameScene: SKScene {

    var orb = SKSpriteNode()
    var Touch: UITouch?
    let theCamera: SKCameraNode = SKCameraNode()

    override func didMoveToView(view: SKView) {

        let orbTexture1 = SKTexture(imageNamed:"orb.png")

        orb = SKSpriteNode(texture: orbTexture1)
        orb.name = "Orb"
        orb.position = CGPointMake(300, 95)
        self.addChild(orb)

        theCamera.position = CGPointMake(300, 0)
        theCamera.name = "Camera"
        self.addChild(theCamera)
        self.camera = theCamera

    }

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        for touch in touches {
            if nodeAtPoint(touch.locationInNode(self)).name == "Orb" {
                Touch = touch as UITouch
            }
        }
    }

    override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
        for touch in touches {
            if Touch != nil {
                if touch as UITouch == Touch! {
                    let location = touch.locationInNode(self)
                        orb.position = location
                }
            }
        }
    }


override func update(currentTime: CFTimeInterval) {
    /* Called before each frame is rendered */

    let action = SKAction.moveToX(orb.position.x, duration: 0.5)
    theCamera.runAction(action)

    }
}

person Chris Mullings    schedule 02.05.2016    source sumber
comment
Jangan gunakan SKActions di dalam Fungsi pembaruan.   -  person Abdou023    schedule 02.05.2016


Jawaban (2)


Anda dapat mengatasi ini dengan menggunakan metode didSimulatePhysics bukan metode update.

Ganti metode pembaruan dengan ini:

>     override func didSimulatePhysics() {
>         let action = SKAction.moveToX(orb.position.x, duration: 0.5)
>         theCamera.runAction(action)
>     }
person Fadi    schedule 04.05.2016
comment
Ini tidak akan membantu sama sekali, satu-satunya hal yang Anda lakukan di sini adalah menunda masalah hingga mendekati akhir pembaruan, kegagapan masih akan terjadi. - person Knight0fDragon; 25.10.2017

Anda mendapatkan pengaruh ini karena pada setiap pembaruan, Anda memasang SKAction baru ke kamera Anda. Artinya dalam 1 detik, kamera Anda diberitahu 60 kali untuk berpindah ke posisi bola. Ini berarti Anda memiliki 60 tindakan yang mengontrol bagaimana sprite Anda seharusnya bergerak, dan semuanya berjuang untuk mendapatkan prioritas.

Yang perlu Anda lakukan adalah menghapus tindakan pemindahan sebelumnya, atau membiarkan tindakan sebelumnya selesai.

Untuk menghapus tindakan tersebut, Anda dapat menghubungi removeAllActions() atau removeAction(forKey:)

Ini tentu saja berarti Anda harus terlebih dahulu menetapkan kunci untuk tindakan Anda, theCamera.runAction(action, withKey:"cameraMove")

Sekarang cara singkat untuk mengganti suatu tindakan adalah dengan memanggil theCamera.runAction(action, withKey:"cameraMove") saja, karena tindakan baru akan menggantikan tindakan yang sudah ada, dengan cara menghapusnya.

Pilihan Anda yang lain adalah memeriksa apakah tindakan tersebut ada dengan action(forKey:) Kemudian tentukan apakah Anda perlu memproses tindakan lebih lanjut.

person Knight0fDragon    schedule 25.10.2017