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

📄 maps.as

📁 AS3代码 A*寻路 请使用FLASH CS3或其他支持AS3语言的软件打开
💻 AS
字号:
package {
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.events.MouseEvent;
	import flash.utils.Timer;
	import flash.events.TimerEvent;
	import flash.events.KeyboardEvent;
	import flash.ui.Keyboard;
	import flash.text.TextField;
	import ARoad;
	public class Maps extends Sprite {
		private var w:uint;//横向节点数
		private var h:uint;//纵向节点数
		private var wh:uint;//节点的宽与高
		private var goo:Number;//控制地图中节点是否可通过的比率,数值在0.1-0.5之间,数值越小,地图上障碍越多
		private var map:Sprite;//地图容器
		private var mapArr:Array=new Array;//地图信息数组
		private var roadMen:MovieClip;//寻路人
		private var roadList:Array;//寻路返回的路径
		private var roadTimer:Timer;//计数器
		private var timer_i:uint=0;//配合计数器实现寻路人动画(很郁闷,不知如何在Timer事件中传递参数,只能这么解决)
		//private var roadinf:TextField
		public function Maps() {
			init();
		}
		//初始化---------------------》
		private function init():void {
			w=98;//地横向节点
			h=60;//地图竖向节点
			wh=9;//节点大小
			goo=0.3;//地图障碍几率
			createMaps();//生成随机地图
			roadMens();//生成寻路人
			roadTimer=new Timer(80,0);//定义计时器以完成寻路人行走动画
			stage.addEventListener(KeyboardEvent.KEY_DOWN,keyDowns);//空格按键事件
		}//End fun init

		//当用户点击地图时开始寻路-------------》
		private function mapMousedown(evt:MouseEvent):void {
			var endX=Math.floor((mouseX-map.x)/ wh);//将鼠标点击位置转化为节点索引值
			var endY=Math.floor((mouseY-map.y)/ wh);//将鼠标点击位置转化为节点索引值
			var endPoint=mapArr[endY][endX];//从地图中取出鼠标点击的节点作为寻路终点
			//如果目的地是可通过的则开始寻路
			if (endPoint.go == 0) {
				//每次寻路开始前将上次的路径清空
				if (roadList) {
					for each (var mc in roadList) {
						mc.alpha=1;
					}
					roadList=[];
				}//End if
				roadTimer.stop();//停止走路
				//动态取得寻路人当前位置的索引,并更新
				roadMen.px=Math.floor(roadMen.x/wh);
				roadMen.py=Math.floor(roadMen.y/wh);
				var _ARoad:ARoad=new ARoad();//生成寻路实例
				var oldTimes:int=new Date().getTime();//记录发送寻路方法时间
				roadList=_ARoad.searchRoad(roadMen,endPoint,mapArr);//调用寻路方法(寻路人,目的地,地图信息)
				var times:int=new Date().getTime()-oldTimes;//寻路方法执行完毕计算寻路花费时间
				if (roadList.length>0) {
					roadinf.htmlText="本次寻路<FONT color='#00ff00'>"+times.toString()+"</FONT> 毫秒";
					roadLen.htmlText="路径长度:<FONT color='#00ff00'>"+roadList.length.toString()+"</FONT>";//路径长度
					MC_play(roadList);//让寻路人行走
				} else {
					roadinf.htmlText="对不起,无路可走";
				}//End if
			}//End if
		}//End fun

		//寻路人行走----------------------》
		private function MC_play(roadList:Array):void {
			roadList.reverse();//倒转数组
			roadTimer.stop();
			timer_i=0;
			roadTimer.addEventListener(TimerEvent.TIMER,goMap);
			roadTimer.start();
			for each (var mc in roadList) {
				mc.alpha=0.3;
			}//End if
		}//End fun
		//每隔一定时间行走一格----------------》
		private function goMap(evt:TimerEvent):void {
			var tmpMC:MovieClip=roadList[timer_i];
			roadMen.x=tmpMC.x;
			roadMen.y=tmpMC.y;
			tmpMC.alpha=1;//经过路径后消除其标识状态
			timer_i++;
			//达到终点行走停止
			if (timer_i>=roadList.length) {
				roadTimer.stop();
			}//End if
		}//End fun
		//生成地图并存储信息-----------------》
		private function createMaps() {
			map=new Sprite  ;//地图容器
			map.x=wh;
			map.y=wh;
			addChild(map);
			map.addEventListener(MouseEvent.MOUSE_DOWN,mapMousedown);//鼠标点击地图事件
			for (var y:uint=0; y < h; y++) {
				mapArr.push(new Array  );//建立二维数组存储地图信息
				for (var x:uint=0; x < w; x++) {
					var mapPoint:uint=Math.round(Math.random() - goo);//随机节点可通过与不可通过
					var point:MovieClip=drawRect(mapPoint);//画出节点
					mapArr[y].push(point);//将节点加入地图数组中
					mapArr[y][x].px=x;//当前节点横向索引位置
					mapArr[y][x].py=y;//当前节点纵向索引位置
					mapArr[y][x].go=mapPoint;//当前节点是否可通过
					mapArr[y][x].x=x * wh;//当前节点的x位置
					mapArr[y][x].y=y * wh;//当前节点的y位置
					map.addChild(mapArr[y][x]);//将节点显示到地图容器中
				}//End for x
			}//End for y
		}//End fun 
		//空格键重生地图--------------------》
		private function keyDowns(evt:KeyboardEvent) {
			var _key=evt.keyCode;
			if ( _key == Keyboard.SPACE) {
				removeChild(map);
				mapArr=[];
				createMaps();
				roadMens();//生成寻路人
				roadTimer.stop();
			}//End if
		}//End if

		//根据传入的随机数画出不同的节点(即可通过/不可通过/寻路人)---》
		private function drawRect(mapPoint:uint):MovieClip {
			var _tmp:MovieClip=new MovieClip;
			var color:uint;
			switch (mapPoint) {
				case 0 :
					color=0x999999;//可通过为灰色
					break;
				case 1 :
					color=0x000000;//不可通过为黑色
					break;
				default :
					color=0xFF0000;//否则为寻路人
			}//End switch
			_tmp.graphics.beginFill(color);
			_tmp.graphics.lineStyle(0.2,0xFFFFFF);
			_tmp.graphics.drawRect(0,0,wh,wh);
			_tmp.graphics.endFill();
			return _tmp;
		}//End fun drawRect

		//生成寻路人-------------------------》
		private function roadMens() {
			roadMen=drawRect(2);
			//让寻路人随机出现在地图上并设置寻路人的横纵向索引位置----->
			var _tmpx:uint=Math.round(Math.random() * (w-1));
			var _tmpy:uint=Math.round(Math.random() * (h-1));
			roadMen.px=_tmpx;//记录所在位置索引值
			roadMen.py=_tmpy;
			roadMen.x=_tmpx * wh;
			roadMen.y=_tmpy * wh;
			mapArr[_tmpy][_tmpx].go=0;//让寻路人出现的地图点变为可通过
			map.addChild(roadMen);
		}

	}
}

⌨️ 快捷键说明

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