SKCameraNode ล่าช้าเมื่อผู้เล่นเคลื่อนที่

ขณะนี้ฉันกำลังพยายามให้กล้องติดตามผู้เล่นของฉัน "orb" ทุกครั้งที่ผู้เล่นถูกย้าย ฉันได้ตั้งค่าตำแหน่งของกล้องให้ย้ายไปยังตำแหน่ง x ของ orb ทุกครั้งที่มีการเคลื่อนย้าย orb อย่างไรก็ตาม ด้วยเหตุผลบางประการ เมื่อ orb ถูกเคลื่อนที่อย่างรวดเร็ว SKCameraNode จะผิดพลาดและติดอ่างราวกับว่ามันกำลังพยายามไล่ตามตำแหน่งของโหนด ฉันได้อ่านแล้วว่าเป็นเพราะหลักฟิสิกส์ทำงานหลังจากการอัพเดตจริง () แต่ฉันไม่รู้ว่าจะแก้ไขปัญหาอย่างไร มีวิธีแก้ไขปัญหานี้หรือไม่?

หมายเหตุ: ฉันไม่ต้องการให้กล้องอยู่ตรงกลาง "ลูกแก้ว" เสมอไป แต่ควรหน่วงเวลาเล็กน้อยในขณะที่กล้องติดตามลูกแก้ว เพื่อให้กล้องรู้สึกเคลื่อนไหวได้อย่างอิสระ (ถ้ามันสมเหตุสมผล)

    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 แหล่งที่มา
comment
อย่าใช้ SKActions ภายในฟังก์ชันการอัพเดต   -  person Abdou023    schedule 02.05.2016


คำตอบ (2)


คุณสามารถแก้ไขได้โดยใช้วิธี DidSimulatePhysics ไม่ใช่วิธีอัปเดต

แทนที่วิธีการอัพเดตด้วยสิ่งนี้:

>     override func didSimulatePhysics() {
>         let action = SKAction.moveToX(orb.position.x, duration: 0.5)
>         theCamera.runAction(action)
>     }
person Fadi    schedule 04.05.2016
comment
สิ่งนี้ไม่ได้ช่วยอะไรเลย สิ่งเดียวที่คุณกำลังทำอยู่ที่นี่คือการชะลอปัญหาจนกว่าจะใกล้สิ้นสุดการอัปเดต อาการกระตุกจะยังคงเกิดขึ้น - person Knight0fDragon; 25.10.2017

คุณได้รับผลกระทบนี้เนื่องจากในการอัพเดตทุกครั้ง คุณกำลังแนบ SKAction ใหม่เข้ากับกล้องของคุณ ซึ่งหมายความว่าใน 1 วินาที กล้องของคุณจะถูกบอกให้ย้ายไปยังตำแหน่งลูกแก้ว 60 ครั้ง ซึ่งหมายความว่าคุณมี 60 การกระทำที่ควบคุมว่าสไปรท์ของคุณควรเคลื่อนที่อย่างไร และการกระทำทั้งหมดกำลังต่อสู้เพื่อให้ได้ลำดับความสำคัญ

สิ่งที่คุณต้องทำคือลบการดำเนินการย้ายก่อนหน้า หรือปล่อยให้การดำเนินการก่อนหน้าเสร็จสิ้น

หากต้องการลบการดำเนินการ คุณสามารถโทร removeAllActions() หรือ removeAction(forKey:)

แน่นอนว่านี่หมายความว่าคุณต้องกำหนดคีย์ให้กับการกระทำของคุณก่อน theCamera.runAction(action, withKey:"cameraMove")

ในตอนนี้ วิธีการแทนที่การกระทำแบบย่อคือเพียงเรียก theCamera.runAction(action, withKey:"cameraMove") เนื่องจากการกระทำใหม่จะแทนที่การกระทำที่มีอยู่โดยการลบออก

ตัวเลือกอื่นของคุณคือตรวจสอบว่ามีการดำเนินการกับ action(forKey:) หรือไม่ จากนั้นพิจารณาว่าคุณจำเป็นต้องดำเนินการเพิ่มเติมหรือไม่

person Knight0fDragon    schedule 25.10.2017