Swift 精灵位置未更新到移动到的位置

Swift 精灵位置未更新到移动到的位置,swift,sprite-kit,position,sknode,touchesmoved,Swift,Sprite Kit,Position,Sknode,Touchesmoved,因为我在spritekit工作,所以我决定不使用UIScrollview,因为从我所能看出它很难实现。相反,基于在线研究,我决定创建一个SKNode,并将我的所有精灵添加为SKNode的子元素。从那里开始,在touchsmoved功能中,我移动了SKNode以复制UIScrollview。这部分工作完美。当我滚动模拟动作时,SKNode会移动所有精灵,但是,如果我打印出->print(spriteA.position),则该值不会从其初始位置更改。当我打印出print(SKNode.positi

因为我在spritekit工作,所以我决定不使用
UIScrollview
,因为从我所能看出它很难实现。相反,基于在线研究,我决定创建一个
SKNode
,并将我的所有精灵添加为
SKNode
的子元素。从那里开始,在
touchsmoved
功能中,我移动了
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)
     }
blueBottle=SKSpriteNode(纹理:SKTexture(图像名称:“瓶子”),尺寸:CGSize(宽度:0.065*size.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=“播放”
blueBottle.zPosition=Layer.ui.rawValue
moveableNode.addChild(blueBottle)
覆盖功能触摸移动(touchs:Set,带有事件:UIEvent?){
用于触摸:触摸中的任何对象{
让位置=触摸。位置(in:self)
接触点=位置
第二位置=位置
}
moveableNode.position.y=touchPoint.y-(firstLocation.y-moveableNodePos.y)
打印(moveableNode.position.y)
打印(bluebottle.position.y)
}

这对我来说很奇怪,因为精灵正在成功移动,但是位置没有更新。。。我能想到的唯一一件事是精灵没有正确地连接到
SKNode

它工作正常,结果如预期

位置是父对象中的位置。因此,在您的例子中,精灵在SKNode中的位置永远不会改变

如果我让你装一个冷却器,让你在冷却器的左边装可乐,在右边装科罗纳斯,你可以这样想。当我们将冷却器移到营地地面时,焦炭在冷却器中的位置仍然相同

编辑

下面是我的例子

如果我想知道焦炭相对于营地的位置,而不是相对于冷却器的位置,我必须转换它

使用

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

从苹果

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

哦,好吧,这很有意义!有什么方法可以更新位置吗?主要目标是当我点击精灵时能够启动一个动作(touchesbeent)->因此如果我的精灵从屏幕底部开始,我将其向上移动,如果我在顶部点击它,它将什么也不做。如果我单击它原来所在的底部的空白区域,将调用该操作。奇怪的是,它没有意识到spriteA.frame.position不在那里:(理论上,我可以在触摸屏上为我想移动的每个精灵编写一行代码-如果我有-比如说20多个精灵同时移动。非常感谢!我已经找到了它,现在工作非常完美:)非常有帮助的罗恩!