当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《找到距给定点一定距离内的所有SKNode的有效方法?》经验,为你挑选了2个好方法。

如果我想知道哪个或哪些节点覆盖了场景的某个点,我可以做scene.nodeAtPoint(point)或者scene.nodesAtPoint(point).有没有一种有效的方法可以用圆圈做类似的事情?这是为了能够找到位置与给定点相距一定距离的所有节点.

我需要这个能够更好地处理用户点击.场景相当稀少(没有太多用户活跃的精灵),所以没有必要要求用户非常精确地点击.我想在水龙头的坐标周围使用某种公差,并检测距离足够接近位置的节点.

到目前为止,我最好的想法是做nodeAtPoint()几次:在水龙头的位置,然后在它的各种偏移处(例如,向上,向右,严格,......,左上).



1> 0x141E..:

为了确定场景中的一个或多个节点是否在触摸事件的固定距离内,1)计算触摸与每个节点之间的距离,以及2)比较该距离是否小于或等于常数.这是一个如何做到这一点的例子:

override func touchesBegan(touches: Set, withEvent event: UIEvent?) {
    if let touch = touches.first {
        let location = touch.locationInNode(self)
        let nodes = nodesNearPoint(self, point:location, maxDistance: 30)
        if nodes.count > 0 {
            print("node is near touch point")
        }
    }
}

// Returns an array of all SKNode objects in the subtree that near the specified point.
// If no nodes are near the point, an empty array is returned.
func nodesNearPoint(container:SKNode, point:CGPoint, maxDistance:CGFloat) -> [SKNode] {
    var array = [SKNode]()
    for node in container.children {
        // Only test sprite nodes (optional)
        if node is SKSpriteNode {
            let dx = point.x - node.position.x
            let dy = point.y - node.position.y

            let distance = sqrt(dx*dx + dy*dy)
            if (distance <= maxDistance) {
                array.append(node)
            }
        }
    }
    return array
}



2> Luca Angelet..:

距离

首先,我们需要一个扩展来找到2之间的距离 CGPoint(s)

extension CGPoint {
    func distance(point: CGPoint) -> CGFloat {
        return CGFloat(hypotf(Float(point.x - self.x), Float(point.y - self.y)))
    }
}

最亲密的孩子

现在我们可以添加一个扩展名来SKScene查找最接近给定点和a的子项maxDistance.

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的场景的直接孩子的数量.

推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有