精灵位置没有更新到它被移动到的位置

Sprite position not updating to where it is being moved to

因为我在 spritekit 工作,所以我决定不使用 UIScrollview 因为据我所知它很难实现。相反,根据在线研究,我决定创建一个 SKNode 并将我所有的精灵添加为 SKNode 的子级。从那里开始,在 touchesMoved 函数中,我移动了我的 SKNode 来复制 UIScrollview。这部分工作完美。 SKNode 和所有精灵都移动到我滚动模拟动作的任何地方,但是,如果我打印出 -> print(spriteA.position),该值不会从它的初始位置改变。当我打印出 print(SKNode.position) 时,值确实从它的初始位置改变了。

    blueBottle = SKSpriteNode(texture: SKTexture(imageNamed: "Bottle"), size: CGSize(width: 0.065*size.height, height: 0.2*size.height))
    blueBottle.position = CGPoint(x: 0.8*size.width, y: topShelf.position.y + 0.5*topShelf.size.height + 0.5*blueBottle.size.height)
    blueBottle.name = "Play"
    blueBottle.zPosition = Layer.ui.rawValue
    moveableNode.addChild(blueBottle)

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        for touch: AnyObject in touches {
            let location = touch.location(in: self)
            touchPoint = location
            secondLocation = location
        }
        moveableNode.position.y =  touchPoint.y - (firstLocation.y - moveableNodePos.y)
        print(moveableNode.position.y)
        print(bluebottle.position.y)
     }

这对我来说很奇怪,因为 sprite 成功移动,但是位置没有更新...我唯一能想到的是 sprite 没有附加到 SKNode正确吗?

它运行正常,结果符合预期。

position 是父项中的位置。所以在你的情况下,精灵在 SKNode 中的位置永远不会改变。

如果我让你打包冷藏箱,然后说冷藏箱左边装可乐,右边装可乐,你可以这么想。当我们将冷却器移到营地时,焦炭在冷却器中的位置仍然相同。 ;)

Edit

进一步以我的相同示例为例

如果我想找出可乐相对于露营地的位置而不是冷却器,我将不得不转换它。

使用...

convert(_:to:)convert(_:from:)

来自苹果...

坐标空间之间的转换 使用节点树时,有时您需要将位置从一个坐标 space 转换为另一个坐标。例如,在物理系统中指定关节时,关节位置在场景坐标中指定。因此,如果您在局部坐标系中有这些点,则需要将它们转换为场景坐标 space。 以下代码显示了如何将节点的位置转换为场景坐标系。要求场景执行转换。请记住,节点的位置是在其父坐标系中指定的,因此代码将 node.parent 作为要转换的节点传递。您可以通过调用 convert(_:to:) 方法反向执行相同的转换。