自動尋路(二)

2021-08-19 20:24:31 字數 2792 閱讀 9896

最近在忙畢設,所以沒有及時更新,抱歉!

上一章主要內容是如何繪製網格並盡可能降低網格的複雜度,利用最終繪製好的網格(即點之間的關係)根據a*演算法就可以實現基本的尋路了

這個尋路是不是和紅警裡面的很像,可以修建/銷毀建築物。不過這只是個簡單的demo,如果運用到遊戲中還需要根據實際情況來進行許多優化/修改。接下來就講一下我的實現原理吧

最開始我想的是無論新增/刪除都重新設定所有點的關係,這樣挺省事了,不用改多少**,不過當建築物過多時,每次修改都需要重新設定網格肯定會消耗很大效能。我的想法是僅重新設定被這次修改場景影響到的網格,思路如下(可以參考文章最下方**):

新增乙個障礙物的時候:

1.判斷並設定這個障礙物上的點和遊戲中的原有點的關係,然後將和這個障礙物有關係的點存起來(記為ptable)

2.設定這個障礙物本身的點關係

3.因為新增了乙個障礙物,所以ptable中的一部分點關係會被破壞,需要將這部分點關係刪除

刪除乙個障礙物的時候:

1.把和這個障礙物有關係的點存起來(記為ptable),並把這些關係刪除

2.將這個障礙物上的點刪除

3.因為新增了乙個障礙物,所以ptable中的一部分點關係需要被新增,需要新增這部分點關係

這個demo是用lua實現的,下面是這一章的部分**,需要demo完整**的點這裡,額,還需要積分啊,沒積分的可以加我q直接要**。有一點需要宣告一下,這個demo新增障礙物時需要保證一定間距,不支援障礙物疊加。

--新增建築物的時候呼叫

function pointtable:addrelation(ptable)

local pretable = {} --原table中關係被破壞的點

for i = 1, #ptable do

--和原有場景中物體的關係

for j = 1, #self.table do

if self:pointrelation(ptable[i],self.table[j]) then

insert(pretable,self.table[j])

endend

--自身點關係

for j = i + 1, #ptable do

local dir = ptable[j].pos - ptable[i].pos

local dis = math.sqrt(dir.x * dir.x + dir.z * dir.z)

if unityengine.physics.raycast(ptable[i].pos,dir,dis,layer.default) == false and unityengine.physics.raycast(ptable[j].pos,-dir,dis,layer.default) == false then

ptable[i]:addtree(ptable[j])

unityengine.debug.drawline(ptable[i].pos,ptable[j].pos,color.red,1000)

endend

end--對原有關係進行檢測

self:resetprerelation(pretable)

end--刪除建築物的時候呼叫

function pointtable:delrelation(ptable)

local pretable = {} --原table中關係被破壞的點

for i = 1, #ptable do

for j=1, #ptable[i].tree do

if not iscontain(ptable,ptable[i].tree[j]) then

insert(pretable,ptable[i].tree[j])

endremove(ptable[i].tree[j].tree,ptable[i])

endremove(self.table,ptable[i])

end--對原有關係進行檢測

self:resetprerelation(pretable)

endfunction pointtable:resetprerelation(ptable)

print(#ptable)

for i = 1, #ptable - 1 do

for j = i + 1, #ptable do

local dir = ptable[j].pos - ptable[i].pos

local dis = math.sqrt(dir.x * dir.x + dir.z * dir.z)

if unityengine.physics.raycast(ptable[i].pos,dir,dis,layer.default) == true or unityengine.physics.raycast(ptable[j].pos,-dir,dis,layer.default) == true then

if iscontain(ptable[i].tree,ptable[j]) then

ptable[i]:deltree(ptable[j])

unityengine.debug.drawline(ptable[i].pos,ptable[j].pos,color.black,1000)

endelse

if not iscontain(ptable[i].tree,ptable[j]) then

ptable[i]:addtree(ptable[j])

endend

endend

end

Qt 迷宮自動尋路

標頭檔案 ifndef widget h define widget h include include include include include include include include include includeusing namespace std struct mypoint...

自動尋路演算法(A 演算法)分享

一 為什麼地圖網格化?位置描述 滑鼠位置使用畫素座標描述。地圖位置使用經度緯度描述。為了方便描述地圖上元素的位置,將地圖網格化。二 什麼是曼哈頓距離?曼哈頓距離 manhattan distance 兩點在南北方向上的距離加上在東西方向上的距離,即d i,j xi xj yi yj 計算曼哈頓距離時...

迷宮尋路(A星尋路演算法)

題目 假設我們有乙個7 5大小的迷宮,如下圖所示,綠色格仔表示起點,紅色的格仔表示終點,中間的3個深灰色格仔表示障礙物。請找到一條從起點到終點最短的路徑。解題思路 需要引入兩個集合和乙個公式,如下 具體步驟 把起點放入openlist 檢查openlist中是否有值,如果沒有則無法到達終點,結束尋路...