(AS3)尋找離自己最近的敵人(基於網格,空間換時間的典型應用)


在基於網格的游戲中,一般都會存在大量的搜索方面的運算。

而一般需要大量運算的時候首先就應該想到使用空間換時間的方法來優化,典型的比如四叉樹: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;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM