如何将一个 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时,我将sourceNodeposition设置为触摸的当前位置。一旦触摸位置位于 targetNode 上方,我想通过匹配它们的位置将 sourceNode 捕捉到 targetNode

我的问题:

我似乎无法在两个坐标空间之间正确转换。我尝试了 convert(_:from:)convert(_:to:) 的不同变体,但 none 有效。我知道 convert 期望两个节点都在同一个节点树中,但是由于它们都是场景的后代,它们不被认为是同一节点树的一部分吗?

(如果 sourceNodetargetNode 与兄弟姐妹在同一坐标系中,则代码仅通过将 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)