我有一个可来回移动的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)
}
是否有可能随着移动而更新?
答案 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),希望它对您有用