2016-09-17 71 views
0

在用戶想要通過鼠標導航或觸摸到某些地圖不可通過的情況下。當發送點到GKObstacleGRpah FindPath它只是返回一個空數組。GKObstacleGraph如何查找最接近的有效點?

我想要單位去最近(或足夠接近)的可通過點。

GKObstacleGraph中找到最接近的有效點的適當方法是什麼?


我明白,我可以得到GKObstacle,所以我可以列舉它的頂點,我知道我單位的位置...

但好...什麼是下一個步驟?

注意:我沒有使用GKAgengts

回答

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

我可能是錯的,但我依稀記得從具有類似的邏輯,蘋果DemoBots - 他們可能是一個很好的參考了。

7.調試層

這永遠把我得到一個概念證明在一起。我強烈建議在調試層上畫線以驗證你的邏輯。