当玩家移动时,SKCameraNode落后了

时间:2016-05-02 16:52:23

标签: xcode swift camera sprite-kit

我正在尝试让我的相机跟随我的播放器" orb"每当玩家移动时。每当球体移动时,我都将相机的位置设置为移动到球体的位置,但是由于某种原因,当球体快速移动时,SKCameraNode会出现故障并且断断续续,就像它是试图赶上节点的位置。我读过它是因为物理在实际更新()之后运行,但我不知道如何解决这个问题。有没有办法解决这个问题?

注意:我不希望相机始终以" orb"为中心,而是在跟随球体时稍微延迟,给它一个自由移动的感觉。 (如果这是有道理的)

    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)

    }
}

2 个答案:

答案 0 :(得分:1)

您可以使用didSimulatePhysics方法而不是更新方法来解决此问题。

将更新方法替换为:

>     override func didSimulatePhysics() {
>         let action = SKAction.moveToX(orb.position.x, duration: 0.5)
>         theCamera.runAction(action)
>     }

答案 1 :(得分:0)

您正在受到这种影响,因为在每次更新时,您都要将新的SKAction附加到相机。这意味着在1秒内,您的相机被告知60次移动到球体位置。这意味着你有60个动作控制你的精灵应该如何移动,并且他们都在努力获得优先权。

您需要做的是删除之前的移动操作,或者让上一个操作完成。

要删除操作,您可以致电removeAllActions()removeAction(forKey:)

这当然意味着您需要先为行动分配一个密钥theCamera.runAction(action, withKey:"cameraMove")

现在,替换操作的简便方法是只调用theCamera.runAction(action, withKey:"cameraMove"),因为新操作将替换现有操作,删除它。

您的另一个选择是检查action(forKey:)行动是否存在。然后确定是否需要处理进一步的操作。