Как я могу получить позицию движущегося узла SKSpriteNode? - PullRequest
0 голосов
/ 28 июня 2018

У меня есть SKSpriteNode, который перемещается назад и вперед. Мне нужно получить его позицию, когда он движется (поэтому он все время меняется) и получить разные позиции, когда он движется по экрану.

Когда я пытаюсь получить позицию, она становится исходной позицией.

Движение объекта:

let right = SKAction.moveBy(x: self.frame.width, y: 0, duration: 3)
let left = SKAction.moveBy(x: -self.frame.width, y: 0, duration: 3)

И это то, что я пытаюсь сделать, чтобы напечатать его позицию как есть.

override func update(_ currentTime: TimeInterval) {
    // Called before each frame is rendered
    pos = String(describing: blockposition.x)
    print(pos)
}

Можно ли получить тот, который обновляется по мере движения?

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

в вашем "классе"

1_ тип var sprite (имя вашего спрайта) = SKSpriteNode ()

2_ затем добавьте свой синод к сцене

3_ затем в функции обновления вызовите print (sprite (имя вашего спрайта) .position.x или y), как вы хотите, надеюсь, это сработало для вас

0 голосов
/ 28 июня 2018

Вы не можете сделать это таким образом.

С https://developer.apple.com/documentation/spritekit/skaction?changes=_1

Наблюдение за изменениями свойств узла Обычно действия не вызывают публичные методы на узлах. Например, если вы хотите, чтобы подкласс SKNode отвечал на действие перемещения (to: duration :), вы можете рассмотреть возможность переопределения его свойства position для добавления наблюдателя didSet (см. Переопределение наблюдателей свойства).

class MovingNode: SKSpriteNode {
    override var position: CGPoint {
        didSet {
            // code to react to position change
        }
    }
}

Однако, поскольку действие перемещения, выполняемое на экземпляре MovingNode, не устанавливает свою позицию, наблюдатель не вызывается, и ваш код, реагирующий на изменение позиции, никогда не выполняется.

В этом примере решением является использование SKSceneDelegate. Сравнивая позицию узла в обновлении делегата (метод _: for :) - который вызывается в начале каждого кадра - с его позицией в методе делегата didEvaluateActions (for :) - который вызывается после оценки любых действий - Вы можете проверить, переместился ли он, и соответственно отреагировать.

В листинге 7 показан пример того, как вы можете реализовать это решение.

Листинг 7 Реакция на изменение положения во время бегового действия

let node = SKNode()
var nodePosition = CGPoint()

func update(_ currentTime: TimeInterval, for scene: SKScene) {
    nodePosition = node.position
}

func didEvaluateActions(for scene: SKScene) {
    let distance = hypot(node.position.x - nodePosition.x,
                         node.position.y - nodePosition.y)

    if distance > 0 {
        // code to react to position change
    }
}
...