(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;

转载于:https://www.cnblogs.com/yili16438/archive/2012/05/02/2479077.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值