(AS3)寻找离自己最近的敌人(基于网格,空间换时间的典型应用)

在基于网格的游戏中,一般都会存在大量的搜索方面的运算。

而一般需要大量运算的时候首先就应该想到使用空间换时间的方法来优化,典型的比如四叉树:AS3 四叉树

 

看下图,这是一个13X13的二维网格地图,图中红方格是代码自已,而周围的黑色方格代表的是敌人

现在要做的是找到周围所有的敌人所在的方格,放到一个数组中,并按照离自己距离的大小由小到大排序。

(AS3)寻找离自己最近的敌人(基于网格,空间换时间的典型应用)

 

最简单、最粗暴的做法当然就是直接遍历整个二维数组,找到标记为黑色的方格,然后再做一个排序。

这里要考虑的是这个运算是需要频繁进行的,所以每次都遍历整个数组再做一个排序消耗有些大。

我这里介绍一种空间换时间的方法,先看以下代码:

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;

你可能感兴趣的:(as3)