Swift 精灵位置未更新到移动到的位置
因为我在spritekit工作,所以我决定不使用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
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多个精灵同时移动。非常感谢!我已经找到了它,现在工作非常完美:)非常有帮助的罗恩!