移动节点后,SKSpriteNode的X,Y坐标不会更改

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了移动节点后,SKSpriteNode的X,Y坐标不会更改相关的知识,希望对你有一定的参考价值。

我有以下代码将SKSpriteNode从屏幕外的位置移动到屏幕上的位置。 spawnNode在屏幕外创建一个起始位置的节点。 nodePositions是一个包含x,y和Zposition点的struct数组。代码确实将节点移动到我想要的位置。但是,我想使用当前节点位置来稍后定位更多节点。打印语句显示相同的结果。 Pre&Post是一样的。这对我来说毫无意义。任何人都可以向我解释这个吗?看起来可能需要创建连续节点的子节点。我不想这样做。

    spawnNode()
    allNodes[0].texture = SKTexture(imageNamed: imageName)

    print("Pre: x: (String(describing: allNodes[0].position.x))")
    print("Pre: y: (String(describing: allNodes[0].position.y))")

    let duration: CGFloat = 0.5
    moveNodePos = SKAction.moveBy(x: nodePositions[0].posX, y: nodePositions[0].posY, duration: TimeInterval(duration))
    moveNodePos.timingMode = .easeIn
    allNodes[0].zPosition = nodePositions[0].zPosition
    allNodes[0].run(moveNodePos)
    print("Post: x: (String(describing: allNodes[0].position.x))")
    print("Post: y: (String(describing: allNodes[0].position.y))")

对于:x:0.0对于:y:500.0 Post:x:0.0 Post:y:500.0

答案

SKAction在0.5秒的时间内移动节点。执行allNodes[0].run(moveNodePos)行,moveBy动作开始,紧随其后的代码(即打印语句)立即执行。这意味着当您执行print语句时,操作仍未完成且节点尚未移动。在动作完成后尝试打印节点的位置,例如运用

allNodes[0].run(moveNodePos, completion: { insert the print statements here } )

希望这可以帮助!

另一答案

SKAction随着时间的推移发生,因为该程序反复通过the rendering loop

由于程序没有通过allNodes[0].run(moveNodePos)运行语句和以下print语句之间的渲染循环,因此该操作没有机会在print语句时修改节点的位置。

以上是关于移动节点后,SKSpriteNode的X,Y坐标不会更改的主要内容,如果未能解决你的问题,请参考以下文章

移动端图标拖动并获取移动后的坐标

如何在 Swift 中围绕其起始值上下移动 SKSpriteNode?

文件拖拽

如何围绕节点的 Y 轴旋转 SKSpriteNode?

重金悬赏,C#中如何更改坐标系X, Y的变化方向

使用 CoreMotion 移动 SKSpriteNode