最近在忙畢設,所以沒有及時更新,抱歉!
上一章主要內容是如何繪製網格並盡可能降低網格的複雜度,利用最終繪製好的網格(即點之間的關係)根據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中是否有值,如果沒有則無法到達終點,結束尋路...