最近有打算寫個迷宮玩玩,無意中發下了這個庫,很強大!又是開源在github的,並且有一個相當酷的demo。這個庫不僅支持瀏覽器端的運行,而且可以運行在node.js上。怎么用到服務器上這里就不涉及了,主要還是翻譯一下官方的demo。
一、基本應用
首先我們要定義一個二維的圖
var grid = new PF.Grid(width, height); //這里的兩個參數定義了圖的長和寬
然后我們可以設置這個圖中一些不能走的節點,用setWalkableAt函數
grid.setWalkableAt(0, 1, false);
這段代碼的意思是設置(0,1)這個點不能走。
當然這樣的話如果圖非常大,不能走的點很多就很復雜了,不過還有一種方法可以讓我們直接用矩陣定義圖,用0,1表示能否到達
1 var matrix = [ 2 [0, 0, 0, 1, 0], 3 [1, 0, 0, 0, 1], 4 [0, 0, 1, 0, 0], 5 ]; 6 var grid = new PF.Grid(5, 3, matrix);
圖建好了之后我們就可以開始最激動人心的地方了,那就是這個庫為我們提供的九種尋路函數。要知道這個要是自己實現還是有不少的困難的。這九中算法分別是:
AStarFinder
*BreadthFirstFinder
*BestFirstFinder
DijkstraFinder
*BiAStarFinder
BiBestFirstFinder
BiDijkstraFinder
*BiBreadthFirstFinder
*JumpPointFinder
*
這九個函數中尾部加了星號的是保證能找到最短路的,從第五個開始四個前綴bi的則是雙向搜索的意思。
要使用這些函數需要首先建立一個查找的對象,一第一種查找為例:
var finder = new PF.AStarFinder();
然后我們用它查找所建立的圖上兩點的路徑:
var path = finder.findPath(1, 2, 4, 2, grid);//表示搜索(1,2)到(4,2)的最短路,運行后path=[ [ 1, 2 ], [ 1, 1 ], [ 2, 1 ], [ 3, 1 ], [ 3, 2 ], [ 4, 2 ] ]
當然它這個算法的實現貌似是直接在原圖上操作的,所以各種算法運行后圖就變了,所以你要多次應用的話就要先復制一份,就像:
var gridBackup = grid.clone();
二、高級應用
1、你可以設置是否允許走斜線:
var finder = new PF.AStarFinder({ allowDiagonal: true });
然后再走斜線的基礎上,你可以設置是否允許從不能走的方塊角上過去:
var finder = new PF.AStarFinder({ allowDiagonal: true, dontCrossCorners: true });
2、我們知道很影響尋路算法的速度的就是他們的啟發函數,在PathFinding中也允許我們定義自己的啟發函數
對於 AStarFinder
, BestFirstFinder
以及他們加了 Bi
前綴,我們就可以設置他的啟發函數,本身提供了三個備選的
1、PF.Heuristic.manhattan (默認值)
2、PF.Heuristic.chebyshev
3、PF.Heuristic.euclidean
如果要修改啟發函數:
var finder = new PF.AStarFinder({ heuristic: PF.Heuristic.chebyshev });
或者是定義自己的啟發函數
var finder = new PF.BestFirstFinder({ allowDiagonal: true, heuristic: function(dx, dy) { return Math.min(dx, dy); } });
三、由於返回的路徑是路徑話說那個的每個點,你也可以只返回那些標志點:
var newPath = PF.Util.smoothenPath(grid, path);
這樣如果原來的path是[[0, 1], [0, 2], [0, 3], [0, 4]]
那么修改之后就是 [[0, 1], [0, 4]]
這樣,有了這個庫歇一歇類似尋路的游戲就不用擔心算法問題啦(當然你追求速度要自己弄個高檔的啟發函數就另說啦),實在是很方便啊!