簡體   English   中英

玩家移動時SKCameraNode落后

[英]SKCameraNode Lags Behind When Player Moves

我目前正在嘗試讓我的相機在移動播放器時跟隨播放器“ orb”。 我將攝影機的位置設置為無論何時移動球,都將其移動到球的x位置,但是由於某些原因,隨着球的快速移動,SKCameraNode會出現毛刺和卡頓,好像它試圖趕上節點的位置一樣。 我讀到這是因為物理過程在實際的update()之后運行,但是我不知道如何解決該問題。 有什么辦法可以解決這個問題?

注意:我不希望相機始終位於“球體”的中心,而是在它跟隨球體時稍微延遲一點,以使它具有自由移動的感覺。 (如果有道理)

    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)

    }
}

您可以使用didSimulatePhysics方法而不是update方法來解決此問題。

將此更新方法替換為:

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

之所以會受到這種影響,是因為在每次更新時,都會在相機上附加一個新的SKAction。 這意味着在1秒內,您的相機被告知60次移動到球體位置。 這意味着您有60個動作控制着精靈的移動方式,它們全都在爭奪優先權。

您需要做的是刪除上一個動作,或者使上一個動作完成。

要刪除該動作,可以調用removeAllActions()removeAction(forKey:)

當然,這意味着您需要首先為操作分配一個鍵, theCamera.runAction(action, withKey:"cameraMove")

現在,替換動作的一種theCamera.runAction(action, withKey:"cameraMove")方法是只調用theCamera.runAction(action, withKey:"cameraMove") ,因為新動作將通過刪除它來替換現有動作。

您的另一個選擇是檢查該動作是否與action(forKey:)存在,然后確定是否需要處理進一步的動作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM