如何获得移动的SKSpriteNode的位置?

时间:2018-06-28 03:14:35

标签: ios iphone swift sprite-kit

我有一个可来回移动的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 :(得分:0)

您不能用这种方式。

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

观察节点属性的变化 通常,操作不会在节点上调用公共方法。例如,如果您想将SKNode子类化以响应move(to:duration :)动作,则可以考虑重写其position属性以添加didSet观察者(请参见Overriding Property Observers)。

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

但是,由于在MovingNode实例上运行的移动动作未设置其位置,因此不会调用观察者,并且永远不会执行对位置变化做出反应的代码。

在此示例中,解决方案是使用SKSceneDelegate。通过比较节点在代理的update(_: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
    }
}

答案 1 :(得分:0)

在您的“班级”中

1_类型var sprite(您的精灵名称)= SKSpriteNode()

2_然后将主教添加到场景

3_,然后在更新功能中调用print(sprite(sprite的名称).position.x或y),希望它对您有用