swift - 找到距给定点一定距离内的所有 SKNode 的有效方法?

标签 swift sprite-kit

如果我想知道哪个或哪些节点覆盖场景的特定点,我可以执行 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/

相关文章:

swift - 如何在 Catalyst 应用程序中将搜索栏添加到 NSToolbar 中?

ios - 有关 Swift 上 iOS 中 drawRect 的性能问题

ios - 使用旧的 SKTextureAtlas 或 SpriteAtlas

ios - 无法在 SK3DNode 上方显示 Sprite

ios - Swift:是否可以在登录时避免 Facebook SDK 4.x "You have already authorized this app"对话框?

swift - 我可以使用内部泛型进行快速扩展吗?

swift - 以某种方式将自定义 .colorNames 添加到 UIColor 中?

Swift 3 我的游戏结束代码无法正常工作

swift - 如何使用 Swift 使 SpriteNode 在 SpriteKit 中旋转?

ios - 快速自定义警报(UIAlertView)