精灵位置没有更新到它被移动到的位置
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:)
方法反向执行相同的转换。
因为我在 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:)
方法反向执行相同的转换。