SKCameraNode отстает, когда игрок движется

В настоящее время я пытаюсь, чтобы моя камера следовала за «шаром» моего игрока всякий раз, когда игрок перемещается. Я установил положение камеры так, чтобы оно перемещалось в положение x шара всякий раз, когда шар перемещается, однако по какой-то причине, когда шар перемещается быстро, 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