`

flex简单基于A*寻路

    博客分类:
  • game
阅读更多

没设置障碍物,熬了一晚上,原来是个很简单的问题

package drawRect
{
	import flash.events.MouseEvent;
	import flash.geom.Point;
	
	import mx.core.UIComponent;
	import mx.logging.Log;
	import mx.controls.*;
	import node.Node;
	public class MyRect extends UIComponent
	{
		public var rectArray:Array=[];
		public var color:uint=0x3215;
		public var COL:int=15;
		public var ROW:int=10;
		public var LENGTH:int=40;
		
		public function MyRect()
		{
			super();
			trace("init");
			Log.getLogger("drawRect.MyRect").debug("sssss");
			Log.getLogger("drawRect.MyRect").info("dsafdasf");
//			mx.controls.Alert.show("init");
			drawRect();
			initEvent();	
		}
		//一列一列的画
		/**
		 * i:0j:0:(x=0, y=0)
		   i:0j:1:(x=0, y=40)
		   i:0j:2:(x=0, y=80)
		   i:1j:0:(x=40, y=0)
           i:1j:1:(x=40, y=40)
           i:1j:2:(x=40, y=80)
		 * 
		 * 
		 * **/
		public function drawRect():void{
			this.graphics.beginFill(color);
			for(var i:int=0;i<this.COL;i++){
				rectArray[i]=new Array;
				for(var j:int=0;j<this.ROW;j++){
					this.graphics.drawRect(i*LENGTH,j*LENGTH,LENGTH-1,LENGTH-1);
					var nd:Node=new Node;
					nd.x=i;
					nd.y=j;
					nd.point=new Point(i*LENGTH,j*LENGTH);
					rectArray[i][j]=nd;
					
					trace("i:"+i+"j:"+j+":"+rectArray[i][j].point)
				}
				
			}
			this.graphics.endFill();
			
			
		}
		public function initEvent(){
			this.addEventListener(MouseEvent.CLICK,onClick);
		}
		public function onClick(e:MouseEvent){
			
			Alert.show(rectArray[13][5]);
			var mx:Number=e.localX;
			var my:Number=e.localY;
			//方法1得到鼠标点击后的数组索引
//			var nodex:int=Math.floor(mx/LENGTH)+(mx%LENGTH>0?1:0)-1;
//			var nodey:int=Math.floor(my/LENGTH)+(my%LENGTH>0?1:0)-1;
			//方法2
			var nodex:int=Math.floor(mx/LENGTH)
			var nodey:int=Math.floor(my/LENGTH)
			trace("mx/length floor:"+Math.floor(mx/LENGTH))
			trace("mx/length"+mx/LENGTH)
			trace("x:"+nodex+"y:"+nodey)
			drawBox(rectArray[nodex][nodey].point);
		}
		public function drawBox(point:Point){
			this.graphics.beginFill(color);
			this.graphics.drawRect(point.x,point.y,LENGTH-1,LENGTH-1);
			this.graphics.endFill();
		}
	}
}

 

package find
{
	import drawRect.MyRect;
	
	import flash.geom.Point;
	
	import mx.controls.*;
	
	import node.Node;
	/**
	 * 1.
将开始节点放入开放列表(开始节点的F和G值都视为0);
2.
重复一下步骤:
            i.
在开放列表中查找具有最小F值的节点,并把查找到的节点作为当前节点;
           ii.
把当前节点从开放列表删除, 加入到封闭列表;
         iii.
对当前节点相邻的每一个节点依次执行以下步骤:
1.
如果该相邻节点不可通行或者该相邻节点已经在封闭列表中,则什么操作也不执行,继续检验下一个节点;
2.
如果该相邻节点不在开放列表中,则将该节点添加到开放列表中, 并将该相邻节点的父节点设为当前节点,同时保存该相邻节点的G和F值;
3.
如果该相邻节点在开放列表中, 则判断若经由当前节点到达该相邻节点的G值是否小于原来保存的G值,若小于,则将该相邻节点的父节点设为当前节点,并重新设置该相邻节点的G和F值.
        iv.
循环结束条件:
当终点节点被加入到开放列表作为待检验节点时, 表示路径被找到,此时应终止循环;
或者当开放列表为空,表明已无可以添加的新节点,而已检验的节点中没有终点节点则意味着路径无法被找到,此时也结束循环;
3.
从终点节点开始沿父节点遍历, 并保存整个遍历到的节点坐标,遍历所得的节点就是最后得到的路径;
	 
	 * G=从起点A沿着已生成的路径到一个给定方格的移动开销。 

       H=从给定方格到目的方格的估计移动开销
	 * * **/
	public class Find
	{
		private var rect:MyRect;//图形
		private var shapeArr:Array=new Array//图形数组
		public var openList:Array=[];
		public var closeList:Array=[];
		public function set Rect(re:MyRect){
			this.rect=re;
		}
		public function Find()
		{
			
		}
		public function init(){
			this.shapeArr=rect.rectArray;
			
		}
		
		public function startfind(start:Node,end:Node){
			
			start.g=0;
			start.h=0;
			start.isOpen=true;
			openList.push(start);
			var i:int=0;
			out:while(openList.length>0){
				var current:Node=this.openList.shift();
				current.isClose=true;
				current.isOpen=false;
				closeList.push(current);
				
				rect.color=0x9999;
				rect.drawBox(current.point);
				if(current.point.equals(end.point)){
					Alert.show(i+"次数");
					break;
				}
				i++;
//				if(i==1){
//					rect.color=0x9999;
//					rect.drawBox(current.point);
//					trace("f:"+current.f)
//					trace("g:"+current.g);
//					trace("h:"+current.h);
//					var nodes:Array=getAround(current,end);
//					for each(var n:Node in nodes){
//						trace("f:"+n.f)
//						trace("g"+n.g);
//						trace("h"+n.h);
//					}
//					break;
//				}
//				i++;
				var nodes:Array=getAround(current,end);
//				mx.controls.Alert.show("sdaffsaf"+nodes.length);
				
				for each(var n:Node in nodes){
//					rect.color=0x9999;
//					rect.drawBox(n.point);
					var g:int=getG(current,n);
					trace("gggggggg"+g);
					var h:int=getH(n,end);
					trace("h::::::"+h);
					trace("point:::::"+n.point)
					trace(n.x+"xxxxxxxxxxxx"+n.y)
					if(n.isOpen){
						if(g<n.g){
							n.g=g;
							n.h=h;
							n.f=n.g+n.h;
							n.isClose=false;
							n.isOpen=true;
							n.parentNode=current;
							updateNode(current,n);
							
						}
					}else{
						    n.g=g;
							n.h=h;
							n.f=n.g+n.h;
							n.isClose=false;
							n.isOpen=true;
							n.parentNode=current;
							openList.push(n);
							openList.sortOn("f",Array.NUMERIC);
//							Alert.show("h:"+h);
							output();
							
					}
				}
//				if(i==0){
//					break out;
//				}
//				break;
			}	
		}
		
		private function output(){
			for each(var nl:Node in openList){
				trace("list:"+nl.f);
			}
			trace("sp");
		}
		/**
		 * i:0j:0:(x=0, y=0)
		   i:0j:1:(x=0, y=40)
		   i:0j:2:(x=0, y=80)
		   i:1j:0:(x=40, y=0)
           i:1j:1:(x=40, y=40)
           i:1j:2:(x=40, y=80)
		 * 
		 * 
		 * **/		
		public function getG(current:Node,np:Node){
			var g=0;
			if(current.x==np.x){
				g=current.g+10;
				return g;
			}
			if(current.y==np.y){
				g=current.g+10;
				return g;
			}
			 return current.g+14;
		} 
		public function getH(around:Node,end:Node):int{
			var cp:Point=around.point;
			var fn:Point=end.point;
			
			
			var leh:int=(Math.abs(around.x-end.x)+Math.abs(around.y-end.y))*10

			return leh;
		}
		//得到周围的节点
		public function getAround(current:Node,end:Node):Array{
			var nodes:Array=new Array;
			var x:int=current.x;
			var y:int=current.y;
			var indexX:int=x;
			var indexY:int=y;
			//左上
			indexX=x-1;
			indexY=y-1;
			getNode(indexX,indexY,nodes);
			//左
			indexX=x-1;
			indexY=y;
			getNode(indexX,indexY,nodes);
			//左下
			indexX=x-1;
			indexY=y+1;
			getNode(indexX,indexY,nodes);
			
			//上
			indexX=x;
			indexY=y-1;
			getNode(indexX,indexY,nodes);
			//下
			indexX=x;
			indexY=y+1;
			getNode(indexX,indexY,nodes);
			//右上
			indexX=x+1;
			indexY=y-1;
			getNode(indexX,indexY,nodes);
			//右
			indexX=x+1;
			indexY=y;
			getNode(indexX,indexY,nodes);
			//下
			indexX=x+1;
			indexY=y+1;
			getNode(indexX,indexY,nodes);
			return nodes;
		}
		public function getNode(indexX:int,indexY:int,nodes:Array){
			if(isValid(indexX,indexY)){
				var node:Node=shapeArr[indexX][indexY];
				nodes.push(node);
			}
		}
		
		public function isValid(x,y):Boolean{
			if(x<0||x>=rect.COL||y<0||y>=rect.ROW){
//				trace("false");
				return false;
			}	
			trace("x:"+x+"y:"+y)
			if(shapeArr[x][y].isClose){
//				trace("false");
				return false;
			}
			return true;
		}
		public function updateNode(current:Node,nod:Node){
			for each(var ns:Node in this.openList){
				if(ns.point.equals(nod.point)){
					ns=nod;
					break;
				}
			}
			openList.sortOn("f",Array.NUMERIC);
		}
	}
}

 

package node
{
	import flash.geom.Point;
	
	public class Node
	{
		public var x:int=0;
		public var y:int=0;
		public var point:Point;
		public var isOpen:Boolean=false;
		public var isClose:Boolean=false;
		public var g:int=0;
		public var h:int=0;
		public var f:int=0;
		public var parentNode:Node=null;
		public function Node()
		{
		}

	}
}

 

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:shape="shape.*" 
	xmlns:drawRect="drawRect.*">
	<mx:VBox>
		<drawRect:MyRect height="400" id="draw">
		
		</drawRect:MyRect>
		<mx:HBox>
			<mx:Button label="start" id="start" click="draw.color=0x2222">
				
			</mx:Button>
			<mx:Button label="end" id="end" click="draw.color=0x8546">
				
			</mx:Button>
			<mx:Button label="fin" click="test()">
				
			</mx:Button>
		</mx:HBox>
	</mx:VBox>
	<mx:Script>
		<![CDATA[
			import find.Find;
			public function test(){
				draw.color=0x4444;
				var fi:Find=new Find;
				fi.Rect=draw;
				fi.init();
				fi.startfind(draw.rectArray[5][0],draw.rectArray[13][9]);
				trace("find");
			}
		]]>
	</mx:Script>
</mx:Application>

 

分享到:
评论

相关推荐

    A*寻路的AS实现例子

    标题 "A*寻路的AS实现例子" 指的是使用ActionScript(一种基于ECMAScript的脚本语言,常用于Adobe Flash开发)实现A*(A-star)寻路算法的一个示例项目。A*算法是一种广泛应用在路径规划中的启发式搜索算法,尤其在...

    A*寻路示例

    在AS3.0中实现A*寻路算法,可以为基于Flex的应用提供动态的路径规划功能,例如在游戏地图上为角色寻找到达目标的最短路径。 首先,A*算法的基本步骤包括: 1. **初始化**:设置起始节点和目标节点,计算所有节点的...

    【原创】Flex中A-star寻路算法

    标题中的“Flex中A-star寻路算法”是指在Adobe Flex这一开发框架中,利用A*(A-star)算法实现路径规划的技术。A*算法是一种在图形中寻找从起点到终点最短路径的搜索算法,广泛应用于游戏开发、地图导航等领域。 A*...

    A星寻路算法(A*)Flex 实现

    在Flex实现A*寻路算法中,你需要关注以下几点: - **数据结构**:实现节点类,包含位置、代价、G值、H值、F值以及指向父节点的引用。 - **图的表示**:可以使用二维数组或邻接矩阵来表示地图和节点之间的连接。 - *...

    flex rpg 网页游戏 as 寻路算法

    在开发Flex RPG(角色扮演游戏)网页游戏时,寻路算法是一项关键的技术,它决定了游戏中的非玩家角色(NPCs)和玩家如何智能地在游戏世界中移动。在AS(ActionScript)环境中,寻路算法是构建游戏逻辑的重要部分。...

    flex帮助文档--(flex学习文档)

    Flex是一个基于MXML和ActionScript的开源框架,用于构建具有丰富用户界面的Web应用。MXML是一种声明式语言,用于定义界面布局和组件,而ActionScript则是面向对象的脚本语言,负责处理程序逻辑和交互。 2. **Flex...

    flex as3游戏寻路源码+详解

    Flex是一种基于开放源代码的、用于构建富互联网应用(RIA)的开发框架,而AS3是Flash平台上广泛使用的编程语言,尤其适合创建互动性和图形丰富的Web内容。 1. **地图加载**:地图是游戏的基础,地图加载涉及将地图...

    FLEX简单应用工程

    **FLEX简介** FLEX(Flexible Application by Adobe)是由Adobe公司开发的...总的来说,“FLEX简单应用工程”是一个适合初学者的项目,通过实践可以深入理解FLEX的基本概念和开发流程,为今后的RIA开发打下坚实基础。

    AS3.0 A星寻路工程实例(含源代码)

    AS3.0是Adobe Flex和Flash Player的主要编程语言,它基于ECMAScript,提供了强大的面向对象特性。在AS3.0中实现A星寻路工程,你需要理解以下几个核心概念: 1. **节点网格**:首先,你需要将地图抽象为二维网格,每...

    Adobe-Flex-简介.doc

    Flex Builder或Flash Builder是基于Eclipse的集成开发环境,提供了代码编辑、调试和部署工具。 **2.3 Flex 元件 MXML** MXML是Flex中的关键元素,它是XML的子集,用于声明界面组件、布局和样式。通过MXML,开发者...

    Flex学习相关资料

    - **Flex Builder**:Adobe提供的集成开发环境(IDE),基于Eclipse,为Flex开发提供了一流的支持,包括代码提示、调试和项目管理功能。 3. **Flex组件模型** - **Spark和MX组件**:Flex 4引入了Spark组件集,与...

    Flex_arcgis.doc

    - **Adobe Flex Builder**:基于Eclipse的IDE,用于Flex应用开发。 3. **Flex应用程序组成** - **Flex Framework**:包含所有创建RIA所需的组件,如容器、控件、数据绑定等。 - **MXML**:基于XML的标记语言,...

    flex白皮书

    - **Flex的目标**:提供一个基于标准的架构,与现有的企业级开发工具、方法和技术相兼容。 #### 四、Flex的关键组件 1. **Flex 应用程序框架** - **MXML(Flex 标记语言)**:用于定义Flex应用界面的XML语言,支持...

    FLEX从入门到精通

    Flex是Adobe公司推出的一种用于构建富互联网应用程序(Rich Internet Applications, RIA)的技术,它基于ActionScript编程语言和MXML标记语言,主要用于开发具有交互性、响应性和动态效果的Web应用程序。Flex以其...

    Flex4 in Action

    - **数据绑定增强**:Flex4 改进了数据绑定机制,使得数据绑定更加简单直观。 - **样式和皮肤分离**:在 Flex4 中,开发者可以轻松地将样式和皮肤分离,从而实现更高级别的可定制性和可维护性。 - **增强的动画和...

    Flex基础

    Flex Builder是基于Eclipse的集成开发环境(IDE),提供了更友好的图形界面和调试工具,方便开发者进行快速开发。 2. **ActionScript与MXML** ActionScript是Flex的主要编程语言,基于ECMAScript,用于处理应用...

    flex学习笔记 flex学习总结 flex学习教程

    Flex是Adobe公司推出的一种用于构建富互联网应用程序(RIA)的技术,它基于ActionScript编程语言和Flex框架,可以创建交互性强、用户体验优秀的Web应用。本教程是作者精心编写的Flex学习资料,适合初学者入门,通过...

    Flex中文帮助文档

    - **Flex中文帮助No4章A、B**: 探讨更高级的主题,如数据服务、动画效果和应用优化。 通过对这些文档的学习,开发者可以从零开始掌握Flex的基本用法,逐步深入到高级特性和实战技巧。了解Flex不仅可以提升Web应用...

    Flex中文帮助-1

    - **ActionScript**:Flex的核心编程语言,是一种基于ECMAScript的脚本语言,支持面向对象编程,常用于控制和交互UI组件。 - **MXML**:标记语言,用于定义Flex应用的用户界面,类似于HTML,但更专注于组件布局和...

Global site tag (gtag.js) - Google Analytics