没设置障碍物,熬了一晚上,原来是个很简单的问题
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实现例子" 指的是使用ActionScript(一种基于ECMAScript的脚本语言,常用于Adobe Flash开发)实现A*(A-star)寻路算法的一个示例项目。A*算法是一种广泛应用在路径规划中的启发式搜索算法,尤其在...
在AS3.0中实现A*寻路算法,可以为基于Flex的应用提供动态的路径规划功能,例如在游戏地图上为角色寻找到达目标的最短路径。 首先,A*算法的基本步骤包括: 1. **初始化**:设置起始节点和目标节点,计算所有节点的...
标题中的“Flex中A-star寻路算法”是指在Adobe Flex这一开发框架中,利用A*(A-star)算法实现路径规划的技术。A*算法是一种在图形中寻找从起点到终点最短路径的搜索算法,广泛应用于游戏开发、地图导航等领域。 A*...
在Flex实现A*寻路算法中,你需要关注以下几点: - **数据结构**:实现节点类,包含位置、代价、G值、H值、F值以及指向父节点的引用。 - **图的表示**:可以使用二维数组或邻接矩阵来表示地图和节点之间的连接。 - *...
在开发Flex RPG(角色扮演游戏)网页游戏时,寻路算法是一项关键的技术,它决定了游戏中的非玩家角色(NPCs)和玩家如何智能地在游戏世界中移动。在AS(ActionScript)环境中,寻路算法是构建游戏逻辑的重要部分。...
Flex是一个基于MXML和ActionScript的开源框架,用于构建具有丰富用户界面的Web应用。MXML是一种声明式语言,用于定义界面布局和组件,而ActionScript则是面向对象的脚本语言,负责处理程序逻辑和交互。 2. **Flex...
Flex是一种基于开放源代码的、用于构建富互联网应用(RIA)的开发框架,而AS3是Flash平台上广泛使用的编程语言,尤其适合创建互动性和图形丰富的Web内容。 1. **地图加载**:地图是游戏的基础,地图加载涉及将地图...
**FLEX简介** FLEX(Flexible Application by Adobe)是由Adobe公司开发的...总的来说,“FLEX简单应用工程”是一个适合初学者的项目,通过实践可以深入理解FLEX的基本概念和开发流程,为今后的RIA开发打下坚实基础。
AS3.0是Adobe Flex和Flash Player的主要编程语言,它基于ECMAScript,提供了强大的面向对象特性。在AS3.0中实现A星寻路工程,你需要理解以下几个核心概念: 1. **节点网格**:首先,你需要将地图抽象为二维网格,每...
Flex Builder或Flash Builder是基于Eclipse的集成开发环境,提供了代码编辑、调试和部署工具。 **2.3 Flex 元件 MXML** MXML是Flex中的关键元素,它是XML的子集,用于声明界面组件、布局和样式。通过MXML,开发者...
- **Flex Builder**:Adobe提供的集成开发环境(IDE),基于Eclipse,为Flex开发提供了一流的支持,包括代码提示、调试和项目管理功能。 3. **Flex组件模型** - **Spark和MX组件**:Flex 4引入了Spark组件集,与...
- **Adobe Flex Builder**:基于Eclipse的IDE,用于Flex应用开发。 3. **Flex应用程序组成** - **Flex Framework**:包含所有创建RIA所需的组件,如容器、控件、数据绑定等。 - **MXML**:基于XML的标记语言,...
- **Flex的目标**:提供一个基于标准的架构,与现有的企业级开发工具、方法和技术相兼容。 #### 四、Flex的关键组件 1. **Flex 应用程序框架** - **MXML(Flex 标记语言)**:用于定义Flex应用界面的XML语言,支持...
Flex是Adobe公司推出的一种用于构建富互联网应用程序(Rich Internet Applications, RIA)的技术,它基于ActionScript编程语言和MXML标记语言,主要用于开发具有交互性、响应性和动态效果的Web应用程序。Flex以其...
- **数据绑定增强**:Flex4 改进了数据绑定机制,使得数据绑定更加简单直观。 - **样式和皮肤分离**:在 Flex4 中,开发者可以轻松地将样式和皮肤分离,从而实现更高级别的可定制性和可维护性。 - **增强的动画和...
Flex Builder是基于Eclipse的集成开发环境(IDE),提供了更友好的图形界面和调试工具,方便开发者进行快速开发。 2. **ActionScript与MXML** ActionScript是Flex的主要编程语言,基于ECMAScript,用于处理应用...
Flex是Adobe公司推出的一种用于构建富互联网应用程序(RIA)的技术,它基于ActionScript编程语言和Flex框架,可以创建交互性强、用户体验优秀的Web应用。本教程是作者精心编写的Flex学习资料,适合初学者入门,通过...
- **Flex中文帮助No4章A、B**: 探讨更高级的主题,如数据服务、动画效果和应用优化。 通过对这些文档的学习,开发者可以从零开始掌握Flex的基本用法,逐步深入到高级特性和实战技巧。了解Flex不仅可以提升Web应用...
- **ActionScript**:Flex的核心编程语言,是一种基于ECMAScript的脚本语言,支持面向对象编程,常用于控制和交互UI组件。 - **MXML**:标记语言,用于定义Flex应用的用户界面,类似于HTML,但更专注于组件布局和...