如何将一个 SpriteNode 的坐标转换为另一个不是子节点或后代节点的坐标
How to convert the coordinates of one SpriteNode to another that is not a child or descendant
在我的 SpriteKit 场景中,我得到了以下设置:
名称为 sourceNode
的几个节点是场景的直接子节点。
名为 targetNode
的节点是另一个名为 sectionNode
的节点的子节点,sectionNode
也是 scene
的子节点。
self
--> sourceNode
self
--> sectionNode
--> targetNode
当使用touchesMoved
方法移动sourceNode
时,我将sourceNode
的position
设置为触摸的当前位置。一旦触摸位置位于 targetNode
上方,我想通过匹配它们的位置将 sourceNode
捕捉到 targetNode
。
我的问题:
我似乎无法在两个坐标空间之间正确转换。我尝试了 convert(_:from:)
和 convert(_:to:)
的不同变体,但 none 有效。我知道 convert
期望两个节点都在同一个节点树中,但是由于它们都是场景的后代,它们不被认为是同一节点树的一部分吗?
(如果 sourceNode
和 targetNode
与兄弟姐妹在同一坐标系中,则代码仅通过将 targetNode
的位置分配给 [= 的位置来工作11=])
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
if let touch = touches.first {
let touchLocation = touch.location(in: self)
let touchedNodes = nodes(at: touchLocation)
guard let sourceNode = touchedNodes.filter({[=10=].name == "sourceNode"}).first else { return }
if let targetNode = touchedNodes.filter({[=10=].name == "targetNode"}).first {
// sourceNode.position = targetNode.position <-- works if both have the same parents
sourceNode.position = convert(targetNode.position, to: sourceNode)
} else {
sourceNode.position = touchLocation
}
}
}
要move/snapsourceNode到targetNode的坐标,可以这样做:
sourceNode.move(toParent: sectionNode)
sourceNode.position = targetNode.position
sourceNode.move(toParent: scene)
在我的 SpriteKit 场景中,我得到了以下设置:
名称为 sourceNode
的几个节点是场景的直接子节点。
名为 targetNode
的节点是另一个名为 sectionNode
的节点的子节点,sectionNode
也是 scene
的子节点。
self
--> sourceNode
self
--> sectionNode
--> targetNode
当使用touchesMoved
方法移动sourceNode
时,我将sourceNode
的position
设置为触摸的当前位置。一旦触摸位置位于 targetNode
上方,我想通过匹配它们的位置将 sourceNode
捕捉到 targetNode
。
我的问题:
我似乎无法在两个坐标空间之间正确转换。我尝试了 convert(_:from:)
和 convert(_:to:)
的不同变体,但 none 有效。我知道 convert
期望两个节点都在同一个节点树中,但是由于它们都是场景的后代,它们不被认为是同一节点树的一部分吗?
(如果 sourceNode
和 targetNode
与兄弟姐妹在同一坐标系中,则代码仅通过将 targetNode
的位置分配给 [= 的位置来工作11=])
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
if let touch = touches.first {
let touchLocation = touch.location(in: self)
let touchedNodes = nodes(at: touchLocation)
guard let sourceNode = touchedNodes.filter({[=10=].name == "sourceNode"}).first else { return }
if let targetNode = touchedNodes.filter({[=10=].name == "targetNode"}).first {
// sourceNode.position = targetNode.position <-- works if both have the same parents
sourceNode.position = convert(targetNode.position, to: sourceNode)
} else {
sourceNode.position = touchLocation
}
}
}
要move/snapsourceNode到targetNode的坐标,可以这样做:
sourceNode.move(toParent: sectionNode)
sourceNode.position = targetNode.position
sourceNode.move(toParent: scene)