⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 searchroad.as

📁 actionscript3做的RPG游戏DEMO及AS3源码
💻 AS
字号:
/*
=================================================================================================
寻路静态类,功能分为以下几个方面:
1,函数startSearch 根据传入的地图数据;终点和起点的X和Y值 计算出合适的路径。寻路时间在1-2毫秒。
=================================================================================================
*/
package com.kamon.Astar{
	//import flash.utils.ByteArray;
	//import flash.utils.getTimer;
	public class SearchRoad {
		private static var isPathFind:Boolean;
		private static var closeA:Array;
		private static var findA:Array;
		private static var dirA:Array=[[1,0,10],[0,1,10],[-1,0,10],[0,-1,10],[1,1,14],[-1,1,14],[-1,-1,14],[1,-1,14]];
		private static var openA:Array;
		private static var walkA:Array;
		private static var endX:uint;
		private static var endY:uint;
		//private static var timer:uint;
		public static function startSearch(mapArr:Array,ex:uint,ey:uint,sx:uint,sy:uint):Array {
			var emptyArray:Array;
			//timer=getTimer();
			endX=ex;
			endY=ey;
			isPathFind=false;
			/*var findAB:ByteArray=new ByteArray;
			findAB.writeObject(mapArr);
			findAB.position=0;
			findA=findAB.readObject()  as  Array;
			*/
			setFindA(mapArr);
			openA=new Array();
			closeA=new Array();
			searchPath(sx,sy,sx,sy,0);
			if (isPathFind) {
				return getPath();
			}
			return emptyArray;
		}
		private static function setFindA(mapArr:Array):void {
			findA=new Array();
			for (var i in mapArr) {
				findA[i]=new Array();
				for (var j in mapArr[i]) {
					if(mapArr[i][j]==0){
					findA[i][j]=0;
					}else{
					findA[i][j]=1;
					}
				}
			}
		}
		private static function getPath():Array {
			var i:uint=closeA.length - 1;
			var n:uint=0;
			walkA=new Array();
			walkA[0]=new Array(2);
			walkA[0][0]=closeA[i][0];
			walkA[0][1]=closeA[i][1];
			var px:uint=closeA[i][2];
			var py:uint=closeA[i][3];
			for (var j=i - 1; j >= 0; j--) {
				if (px == closeA[j][0] && py == closeA[j][1]) {
					n++;
					walkA[n]=new Array(2);
					walkA[n][0]=closeA[j][0];
					walkA[n][1]=closeA[j][1];
					px=closeA[j][2];
					py=closeA[j][3];
				}
			}
			walkA.reverse();
			//trace("timer is " + (getTimer() - timer));
			//trace(walkA);
			return walkA;
		}
		private  static function searchPath(nx:uint,ny:uint,px:uint,py:uint,g:uint) {
			var hval:uint=0;
			var gval:uint=0;
			var min:uint=0;
			var len:uint=0;
			findA[ny][nx]=1;
			closeA.push([nx,ny,px,py]);
			for (var n:uint=0; n < 8; n++) {
				var adjX=nx + dirA[n][0];
				var adjY=ny + dirA[n][1];
				if (adjX < 0 || adjX >= findA.length || adjY < 0 || adjY >= findA.length) {
					continue;
				}
				if (adjX == endX && adjY == endY) {
					closeA.push([adjX,adjY,nx,ny]);
					isPathFind=true;
					return;
				}
				if (findA[adjY][adjX] == 0) {
					hval=10 * (Math.abs(endX - adjX) + Math.abs(endY - adjY));
					gval=g + dirA[n][2];
					findA[adjY][adjX]=gval;
					openA.push([adjX,adjY,nx,ny,gval + hval,gval]);
				} else if (findA[adjY][adjX] > 1) {
					gval=g + dirA[n][2];
					if (gval < findA[adjY][adjX]) {
						hval=10 * (Math.abs(endX - adjX) + Math.abs(endY - adjY));
						for (var j:uint=1; j < openA.length; j++) {
							if (openA[j][0] == adjX && openA[j][1] == adjY) {
								openA[j]=[adjX,adjY,nx,ny,gval + hval,gval];
								findA[adjY][adjX]=gval;
								break;
							}
						}
					}
				}
			}
			if (openA.length < 1) {
				//trace("No Path");
				isPathFind=false;
				return;
			} else {
				len=openA.length;
				for (var m=0; m < len; m++) {
					if (openA[min][4] > openA[m][4]) {
						min=m;//获取最小F值
					}
				}
				var moveToCloseA:Array=openA.splice(min,1);
				searchPath(moveToCloseA[0][0],moveToCloseA[0][1],moveToCloseA[0][2],moveToCloseA[0][3],moveToCloseA[0][5]);
			}
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -