如果我想知道哪个或哪些节点覆盖场景的特定点,我可以执行 scene.nodeAtPoint(point)
或 scene.nodesAtPoint(point)
。有没有一种有效的方法可以用圆 做类似的事情?也就是能够找到在给定点一定距离内的所有节点。
我需要它能够更好地处理用户点击。场景相当稀少(上面没有太多用户事件的 Sprite ),因此无需要求用户非常精确地点击。我想在水龙头坐标周围使用某种公差,并检测刚好接近水龙头位置的节点。
到目前为止,我最好的想法是多次执行 nodeAtPoint()
:在水龙头的位置,然后以不同的偏移量(例如向上、向右、向右) , ..., 左上)。
最佳答案
距离
首先我们需要一个扩展来找到 2 个 CGPoint(s)
extension CGPoint {
func distance(point: CGPoint) -> CGFloat {
return CGFloat(hypotf(Float(point.x - self.x), Float(point.y - self.y)))
}
}
最近的 child
现在我们可以向 SKScene
添加扩展,以找到距离给定点最近且在 maxDistance
范围内的 child 。
extension SKScene {
func closestChild(point: CGPoint, maxDistance: CGFloat) -> SKNode? {
return self
.children
.filter { $0.position.distance(point) <= maxDistance }
.minElement { $0.0.position.distance(point) < $0.1.position.distance(point) }
}
}
时间
上述扩展的计算复杂度为 O(n)
,其中 n
是场景的直接子级的数量。
关于swift - 找到距给定点一定距离内的所有 SKNode 的有效方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34474239/