SpriteKit - 获取最近的节点

7

有没有办法获取最接近节点的节点?

我即将编写一种方法来迭代所有节点并计算距离等...但不知道是否有更好的方法?

我有30个节点,需要每个节点的2个最近节点(如果这有意义的话)。


5
我不确定SpriteKit是否有现成的方法来实现这一点。作为一个通用的算法问题,除非你有100个节点,否则优化搜索所涉及的开销超过了收益。另外,我想知道你是否考虑过寻找两个最近节点结果的缺乏对称性。换句话说,如果B和C是离A最近的两个节点,那并不意味着A是离B最近的两个节点之一。 - user3386109
是的,我已经考虑到了不对称性。最终,我通过对节点数组进行排序(按与给定节点的距离)并返回所需大小的子数组来完成它。可能不是很高效,但我正在尝试......而且现在已经是凌晨1点了。 :D - Fogmeister
3
一种优化策略称为空间分区,但如上所述,如果节点数不足数百个,则可能过于繁琐。 - CodeSmile
1
除非你有数百个节点 或者 你每秒要执行数百次。 - Oxcug
2个回答

6
自iOS 10起,您可以使用GampelayKit的空间分区功能。在2D中,根据您的需要选择GKQuadtreeGKRTree
从文档中得知:
“对于不同的任务,四叉树和R树具有不同的性能权衡:当物体在空间中更加均匀分布或它们的位置经常发生变化时,四叉树可能更快;而当搜索给定区域内的所有对象时,R树可能更快。”
将您的敌人添加到树中:
    let minX = Float(enemy.frame.minX)
    let minY = Float(enemy.frame.minY)
    let maxX = Float(enemy.frame.maxX)
    let maxY = Float(enemy.frame.maxY)

    var enemiesRTree = GKRTree(maxNumberOfChildren: 3)
    enemiesRTree.addElement(enemy,
                             boundingRectMin: vector2(minX, minY),
                             boundingRectMax: vector2(maxX, maxY),
                             splitStrategy: GKRTreeSplitStrategy.linear)

然后您可以按区域搜索。
    let enemiesInProximity = enemiesRTree.elements(
       inBoundingRectMin: vector2(0, 0),
       rectMax: vector2(100, 100))

你可以创建搜索区域,例如相对于玩家的位置。

1
我认为你的方法是这种情况下最合适的。如果你将所有节点存储在数组中,可能会有一种相对高效的方法来完成上述操作。
在任何情况下,您仍可能需要处理最接近的三个节点。如果这不是问题,您可以使用一种方法,该方法需要一个节点位置,然后使用for循环投影“无形圆圈”,直到一个圆圈最终包含恰好2个节点。然后只需返回这些节点。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接