如何根据坐标位置确定对应SpriteNode的名称?
查找指定坐标位置的SpriteNode名称(SpriteKit)
嘿,我来帮你搞定这个问题!在SpriteKit里想找到某个坐标点上的SpriteNode名称,其实用系统自带的方法就能轻松实现,下面分两种常见场景给你详细说明:
1. 节点直接属于场景(SKScene)的子节点
如果你的sharesA、sharesB这些SpriteNode都是直接添加到当前场景中的,那可以直接用场景的nodes(at:)方法来获取该坐标点上的所有节点:
// 定义你要查找的目标坐标点 let targetPoint = CGPoint(x: 1159, y: 406) // 获取场景中该坐标点上的所有节点(可能有多个重叠节点) let nodesAtTargetPoint = self.nodes(at: targetPoint) // 遍历节点数组,提取每个节点的名称 for node in nodesAtTargetPoint { if let nodeName = node.name { print("找到匹配的节点:\(nodeName)") } else { print("发现一个未命名的节点") } }
小提示:
nodes(at:)方法会返回所有覆盖该坐标点的节点,顺序是从视觉层级最上层(zPosition最高)的节点开始往下排列。如果只需要最上层的那个节点,直接取数组的第一个元素即可:nodesAtTargetPoint.first?.name。- 这个方法默认会检查节点的可点击区域(对于SpriteNode来说,会参考纹理的alpha通道,透明区域不会被判定为包含该点)。
2. 节点属于某个父节点的子节点
如果你的SpriteNode是添加在某个父节点(比如一个SKNode容器)下的,那需要先把场景坐标转换成父节点的本地坐标,再进行查找:
// 目标坐标点 let targetPoint = CGPoint(x: 1159, y: 406) // 假设你的节点都在这个父节点里 guard let parentNode = self.childNode(withName: "parentContainer") else { print("父节点不存在") return } // 将场景坐标转换为父节点的本地坐标 let localPoint = parentNode.convert(targetPoint, from: self) // 在父节点范围内查找该本地坐标上的节点 let nodesAtLocalPoint = parentNode.nodes(at: localPoint) // 同样遍历提取名称 for node in nodesAtLocalPoint { if let nodeName = node.name { print("找到匹配的节点:\(nodeName)") } }
这样就能精准定位到你要找的SpriteNode名称啦!
内容的提问来源于stack exchange,提问作者SashDing
相关产品推荐
相关产品推荐

