GKObstacleGraph如何找到最近的有效点?

时间:2016-09-17 12:21:35

标签: path-finding gameplay-kit

在用户想要通过鼠标或触摸导航到一些不可通过的地图的情况下。将点发送到GKObstacleGRpah FindPath时,它只返回一个空数组。

我希望单位最接近(或足够近)可通行点。

GKObstacleGraph中找到最接近的有效点的适当方法是什么。

我知道我可以获得GKObstacle所以我可以列举它的顶点,我知道我单位的位置......

但是......下一步是什么?

注意:我没有使用GKAgengts

1 个答案:

答案 0 :(得分:1)

这是我在解决这个问题时的想法。可能有一个更简单的答案,但我还没有找到它。

<强> 1。弄清楚一个点是否有效。

为此,我实际上有每个障碍物的CGPath表示。我从PhysicsEditor导出路径,然后通过自定义脚本加载它们,将脚本转换为CGPath。我总是存储CGPath以及我从路径创建的GKObstacle。最后,我可以致电CGPathContainsPoint来确定包含该点的障碍物。如果是的话,我知道这一点无效。

<强> 2。一旦该点无效,找出点击了哪个障碍物。

凭借我在#1中的方法,我已经掌握了CGPath及其所属的障碍。

第3。找到最近的顶点

现在我知道障碍物,找到最接近正在移动的单位的顶点。我找不到壁橱顶点到点击点,因为它可能在一个角落。相反,找出所需位置和单位之间的向量。然后,通过顶点从所需位置绘制一条不可见线。我用这个等式来找出线条的交叉位置。

   // http://stackoverflow.com/questions/1811549/perpendicular-on-a-line-from-a-given-point
    let k = ((end.y - start.y) * (hitPoint.x - start.x) - (end.x - start.x) * (hitPoint.y - start.y)) / ((end.y - start.y) * (end.y - start.y) + (end.x - start.x) * (end.x - start.x))
    let x4 = hitPoint.x - k * (end.y - start.y)
    let y4 = hitPoint.y + k * (end.x - start.x)
    let ret = float2(x: x4, y: y4)

<强> 4。按单位大小偏移到移动单位的交叉点

知道路径与向量相交的位置,我们可以移动到交点+(向量*单位大小)。

<强> 5。边缘情况

当你有两个相互碰撞的障碍物,或者你有很大的障碍物时,这会变得棘手。用户可能会认为他们正在移动到地图的远端,但是此脚本将跟随可能在附近的壁橱有效点。因此,我废弃了所有代码,我只是不允许你移动到无效位置。发出红色X和嗡嗡声,提示用户在地图上选择新的有效位置。

<强> 6。 DemoBots

我可能错了,但我模糊地回忆起Apple的DemoBots有类似的逻辑 - 它们也可能是一个很好的参考。

<强> 7。调试层

这让我一起得到一个概念证明。我强烈建议在调试层上绘制线条以验证您的逻辑。

相关问题