SpriteKit - 获取最近的节点

时间:2014-03-28 23:28:36

标签: ios sprite-kit

有没有办法让最近的节点到节点?

我正准备编写一个迭代所有节点并计算距离等的方法......但是想知道是否有更好的方法?

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

2 个答案:

答案 0 :(得分:3)

从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 :(得分:1)

我相信你的方法最适合这种情况。如果以阵列样式存储所有节点,可能会有一种相对有效的方法来执行上面提到的操作。

在任何情况下,您仍然可能有三个节点最近的任务。如果这不是问题,则使用一种方法,该方法采用节点位置,然后使用for循环投影半径增加的“不可见圆”,直到圆最终包含2个节点。然后只返回那些节点。