在基於網格的游戲中,一般都會存在大量的搜索方面的運算。
而一般需要大量運算的時候首先就應該想到使用空間換時間的方法來優化,典型的比如四叉樹:AS3 四叉樹
看下圖,這是一個13X13的二維網格地圖,圖中紅方格是代碼自已,而周圍的黑色方格代表的是敵人
現在要做的是找到周圍所有的敵人所在的方格,放到一個數組中,並按照離自己距離的大小由小到大排序。
最簡單、最粗暴的做法當然就是直接遍歷整個二維數組,找到標記為黑色的方格,然后再做一個排序。
這里要考慮的是這個運算是需要頻繁進行的,所以每次都遍歷整個數組再做一個排序消耗有些大。
我這里介紹一種空間換時間的方法,先看以下代碼:
package org.easily.utils { import flash.geom.Point; import org.easily.debug.XPerf; public class Offsets { public static const SIZE:int = 50; public static var list:Array; public static function init():void { list = []; for (var x:int = -SIZE; x <= SIZE; ++x) { for (var y:int = -SIZE; y <= SIZE; ++y) { list.push(new Point(x, y)); } } XPerf.perf("Offsets.init"); ArrayUtils.quickSort(list, compFunc); function compFunc(p1:Point, p2:Point):Boolean { return p1.length > p2.length; } XPerf.stop(); } } }
這個類初始化了一個點的偏移數組,一般來說,離自己最近的方格,偏移量應該是最小的,所以這時候遍歷網格的時候應該是這個樣子:
var stand:Node; var enemyList:Array = []; var len:int = row * col; for (var i:int = 0; i < len; ++i) { var offset:Point = Offsets.list[i]; var node:Node = grid.getNode(stand.x + offset.x, stand.y + offset.y); if (node.color == NodeColor.BLACK) { enemyList.push(node); } } return enemyList;