- 浏览: 44691 次
- 性别:
- 来自: 广州
最新评论
曾经写过A*寻路算法的教程,但没有贴出任何代码,这次代码全都贴出,大家可以进一步学习
我只是按照A*的基本思想,将A*寻路算法用AS3实现了一下,没有做太多的寻路优化等
如果你本身已经会用A*寻路算法了,那么下面的代码也不必研究了
代码中注释很多,就不贴过多的解释
看代码以前,可以先看看下面这两篇文章,或者看代码的时候配合例子和教程来看
A*(A星)寻路算法讲解
A*寻路算法,DEMO展示
在DEMO展示中,有三个版本,由于代码写了很久了,我也不记得下面贴出的代码是哪个版本的了,见谅。。
首先是文档类Index.as:
package code{
import flash.display.Sprite;
import flash.text.TextField;
import flash.text.TextFormat;
public class Index extends Sprite{
private var road:Road;
public function Index(){
stage.align = "TL";
stage.scaleMode = "noScale";
stage.showDefaultContextMenu = false;
init();
}
//初始化
private function init():void{
road = new Road;
addChild(road);
road.x = GV.ROAD_INIT_X;
road.y = GV.ROAD_INIT_Y;
//地图规格申明
var text:TextField = new TextField;
text.htmlText = "地图规格:50*50方格,障碍物500方格 寻路算法:A*(星) 制作:sunbright";
addChild(text);
text.x = 25;
text.y = 530;
text.width = 500;
text.selectable = false;
text.mouseEnabled = false;
text.setTextFormat(new TextFormat("宋体",12,0xffffff));
text = null;
}
}
}
定义参数的类:GV.as
package{
public class GV{
public function GV(){
throw new Error("变量");
}
//Road创建的初始x、y坐标
public static const ROAD_INIT_X:int = 25;
public static const ROAD_INIT_Y:int = 25;
//纵横方块参数
public static const WIDTH_NUMBER:int = 50;
public static const HEIGHT_NUMBER:int = 50;
public static const WIDTH_TOTAL:int = 500;
public static const HEIGHT_TOTAL:int = 500;
public static const GRID_WIDTH:int = 10;
public static const GRID_HEIGHT:int = 10;
//障碍物个数
public static const THING_NUMBER:int = 500;
//state状态参数表示
public static const HAVE_THING:int = 1;
public static const IMPASSE_VALUE:int = 2;
public static const MAIN_VALUE:int = 8;
//路径耗费固定值
public static const BIAS_VALUE:int = 14;
public static const LINE_VALUE:int = 10;
//文本表示
public static const IMPASSE:String = "死路!";
public static const RESULT_FRONT:String = "用时 ";
public static const RESULT_BACK:String = " 毫秒";
}
}
主要算法所存在的Road.as类
package code{
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.text.TextField;
import flash.text.TextFormat;
import flash.utils.clearInterval;
import flash.utils.getTimer;
import flash.utils.setInterval;
public class Road extends Sprite{
private var lands:Sprite;
private var things:Sprite;
private var c:Coordinate;
private var main:Main;
private var click:Sprite;
private var drawPath:Sprite;
private var result:TextField;
private var unlockList:Array;
private var lockList:Object;
private var targetIX:int;
private var targetIY:int;
private var intervalID:int = 0;
private var startTime:int;
private var endTime:int;
public function Road(){
init();
}
//初始化
private function init():void{
//创建坐标
c = new Coordinate;
//创建文本框
result = new TextField;
result.mouseEnabled = false;
result.autoSize = "left";
result.y = -20;
result.selectable = false;
result.defaultTextFormat = new TextFormat("宋体",12,0xffffff);
addChild(result);
result.text = "结果";
//创建平原
lands = new Sprite;
lands.mouseChildren = false;
lands.mouseEnabled = false;
addChild(lands);
lands.graphics.beginFill(0xff0000);
lands.graphics.lineStyle(0);
lands.graphics.drawRect(0,0,GV.WIDTH_TOTAL,GV.HEIGHT_TOTAL);
for(var i:int = 1; i = GV.WIDTH_NUMBER || iy >= GV.HEIGHT_NUMBER){
return null;
}
//是否有障碍物
if(c[ix][iy].isThing){
return null;
}
//是否已经加入关闭标记列表
if(lockList[ix + "_" + iy]){
return null;
}
//是否已经加入开启标记列表
if(unlockList[ix + "_" + iy]){
return null;
}
//判断当斜着走的时候,它的上下或者左右是否有障碍物
if(p){
if(c[_p.ix][iy].isThing || c[ix][_p.iy].isThing){
return null;
}
}
var cx:Number = Math.abs(targetIX - ix);
var cy:Number = Math.abs(targetIY - iy);
return new Sign(ix,iy,
p ? GV.BIAS_VALUE : GV.LINE_VALUE,
(cx + cy) * 10,
_p);
}
}
}
标记数据记录,Sign.as类
package code{
public class Sign{
private var _ix:Number;
private var _iy:Number;
private var _p:Sign;
private var _f:int = 0;
private var _g:int = 0;
private var _h:int = 0;
//f表示路径评分、g表示当前移动耗费、h表示当前估计移动耗费
//公式:f = g + h,表示路径评分的算法
//ng值表示以父标记为主标记的g值
//nh值表示当前估计移动耗费
public function Sign(_ix:Number,_iy:Number,ng:int,nh:int,_p:Sign = null){
this._ix = _ix;
this._iy = _iy;
this._p = _p;
if(_p){
_g = _p.g + ng;
_h = nh;
_f = _g + _h;
}
}
//获取该标记的坐标
public function getSign():Object{
return {x:_ix * GV.GRID_WIDTH,y:_iy * GV.GRID_HEIGHT};
}
//获取它表示的x坐标
public function get ix():int{
return _ix;
}
//获取它表示的y坐标
public function get iy():int{
return _iy;
}
//获取父标记
public function get p():Sign{
return _p;
}
//获取路径评分
public function get f():int{
return _f;
}
//获取当前路径移动耗费
public function get g():int{
return _g;
}
//获取当前路径耗费估值
public function get h():int{
return _h;
}
//重写toString值
public function toString():String{
return ix + "," + iy;
}
}
}
某点状态类,State.as
package code{
public class State{
public var value:int = 0;
public function State(){
}
//获取是否障碍
public function get isThing():Boolean{
return value == GV.HAVE_THING;
}
//获取是否死路
public function get isWalk():Boolean{
return value == GV.IMPASSE_VALUE;
}
//重写toString
public function toString():String{
return value.toString();
}
}
}
物体类:Thing.as
package code{
import flash.display.Sprite;
public class Thing extends Sprite{
public function Thing(){
init();
}
//初始化
private function init():void{
graphics.beginFill(0);
graphics.drawRect(0,0,GV.GRID_WIDTH,GV.GRID_HEIGHT);
mouseEnabled = false;
mouseChildren = false;
}
}
}
坐标系类,Coordinate.as
package code{
public dynamic class Coordinate extends Array{
public function Coordinate(){
init();
}
//初始化
private function init():void{
for(var i:int = 0; i
主角类,Main.as
package code{
import flash.display.Sprite;
public class Main extends Sprite{
public function Main(){
init();
}
//初始化
private function init():void{
graphics.beginFill(0x0000ff);
graphics.drawRect(0,0,GV.GRID_WIDTH,GV.GRID_HEIGHT);
mouseEnabled = false;
mouseChildren = false;
}
//获取ix坐标
public function get ix():int{
return int(x / GV.GRID_WIDTH);
}
//获取iy坐标
public function get iy():int{
return int(y / GV.GRID_HEIGHT);
}
}
}
[url=http://www.xiaos8.com/uploads/flash/seekroad.rar]
源文件打包下载[/url]
下载源文件,直接打开move.fla运行即可
本文转自:http://www.5uflash.com/flashjiaocheng/Flash-as3-jiaocheng/4791.html
发表评论
-
flv制作工具大全
2010-04-10 09:50 679Collected links to Flash Vid ... -
FLV播放器汇总
2010-04-10 09:50 569http://www.dengjie.com/weblog/c ... -
FCS阅读笔记29 服务器日志
2010-04-10 09:49 572在管理FlashCom MX Server的时候,一件非常重要 ... -
FCS阅读笔记29 服务器日志
2010-04-10 09:49 731在管理FlashCom MX Server的时候,一件非常重要 ... -
Flash Media Server 起步(13)再说说SO....onSync(list)
2010-04-10 09:49 511很早以前写过so,当时 ... -
flash AS3爱好者不可缺少的Class Diagram( 类图表 )下载
2010-04-09 12:46 983很早前就在 RIS 上发现了一张 101.588cm x 71 ... -
flash AS3爱好者不可缺少的Class Diagram( 类图表 )下载
2010-04-09 12:45 925很早前就在 RIS 上发现了一张 101.588cm x 71 ... -
flash AS3.0 的第一步: Hello World
2010-04-09 12:45 1055应网友(他原是美工的)的要求,写一篇Flash CS3 的基 ... -
flash AS3.0 的第一步: Hello World
2010-04-09 12:45 991应网友(他原是美工的)的要求,写一篇Flash CS3 的基 ... -
as3游戏开发之打气球系列(二)
2010-04-09 12:45 561HI,经过了昨天疯狂的理 ... -
as3.0游戏开发之打气球系列(一)
2010-04-09 08:25 567好久没有写正经的文章 ... -
as3按钮事件
2010-04-09 08:24 546在刚开始学As3时,如果不知道按钮的事件如onPress的话 ... -
【as3】ActionScript 3.0体验试教学视频教程
2010-04-09 08:24 379很不错的视频教程 原文地址: http://blog.sina ... -
as3 使用sound类(翻译)-暂停和继续播放声音
2010-04-09 08:24 573[1b]问题十[/1b] 如何暂停声音,如何从暂停的地 ... -
指针随鼠标移动的flash卡通时钟
2010-04-08 07:49 534。先看下时钟效果: var fnum:Number = ... -
动画人物运动规律与节奏
2010-04-08 07:49 562本文转自:h ... -
Flash绘制美丽风景画之海滩
2010-04-08 07:49 464过前段时间学习,我们掌握了鼠绘的一些初步知识,今天我们来综合一 ... -
Flash制作卷轴水墨画展开动画效果
2010-04-08 07:48 659北京奥运会开幕式上那充满诗意的卷轴,以及它所呈现给我们的一幅幅 ... -
Flash鼠绘入门第十三课:绘制美丽春日飞燕
2010-04-08 07:48 511相传燕子于春天社日北 ... -
为AS2.0添砖加瓦-编写类扩展
2010-04-07 10:18 714[1b][序] [/1b]基于类的编程,使得我们可以更加轻松地 ...
相关推荐
在这个"as3 A*寻路源码"中,我们可以深入理解A*算法的工作原理及其在ActionScript 3(AS3)中的实现。 A*算法的核心思想是结合了Dijkstra算法的全局最优性和最佳优先搜索的效率。它通过一个评估函数f(n)来指导搜索...
在AS3.0(ActionScript 3.0)中实现A星寻路算法,可以用于Flash游戏或应用中的角色移动、物体导航等功能。 AS3.0是Adobe Flex和Flash Player的主要编程语言,它基于ECMAScript,提供了强大的面向对象特性。在AS3.0...
在AS3(ActionScript 3)这种面向对象的编程语言中实现A*寻路算法,可以为游戏开发、地图导航等场景提供强大的路径计算支持。 首先,我们来看A*算法的基本原理。A*算法通过评估每个节点的F值来决定搜索方向,F值由G...
标题 "A*寻路的AS实现例子" 指的是使用ActionScript(一种基于ECMAScript的脚本语言,常用于Adobe Flash开发)实现A*(A-star)寻路算法的一个示例项目。A*算法是一种广泛应用在路径规划中的启发式搜索算法,尤其在...
10. **算法应用**:压缩包中的代码例子可能涉及到各种算法,如搜索算法(A*寻路)、图形算法(碰撞检测、渲染优化)、数据结构(队列、栈、图)等,这些都是游戏开发中的基础工具。 通过对这些知识点的深入理解和...
这里我们关注的是基于ACTIONSCRIPT 3 (AS3)实现的A*(A-Star)寻路算法。A*算法是一种启发式搜索算法,它结合了Dijkstra算法的全局最优性和BFS(广度优先搜索)的高效性,被广泛用于游戏中的智能体寻路问题。 A*...
本压缩包提供的资源着重于AS3中如何实现这些功能,特别是A*(A-Star)寻路算法的应用。 ActionScript3是Adobe Flash平台的主要编程语言,它支持面向对象编程,提供了强大的性能和灵活性,是制作互动内容和游戏的...
A星(A*)寻路算法是计算机图形学和游戏开发中常用的一种路径搜索算法,它用于在带有障碍物的网格环境中找到两点之间的最短...而提供的`pathFinding-src`文件可能包含了AS3实现A星算法的源代码和示例,可供学习和参考。
通过深入研究这个塔防游戏的AS3.0源码,初学者不仅可以掌握基本的游戏编程概念,还能了解到面向对象编程和A*寻路算法的实际应用,对于提升编程技能和理解游戏开发流程大有裨益。同时,通过对`library.swf`和`catalog...
在提供的Flex工程文件中,你将找到源代码,包括ActionScript类和MXML界面文件,它们展示了如何在Flex环境中实现和展示A*算法。你可以通过运行和调试代码来理解每个部分的工作原理,进一步学习和改进寻路算法。
通过分析和运行这些文件,我们可以进一步了解如何在Flex项目中具体实现A*寻路算法。这不仅涉及到算法的理论理解,还需要对Flex框架和ActionScript编程有一定的掌握。如果你想要深入学习或实现这个项目,可以从阅读...
ActionScript是一种面向对象的编程语言,常用于开发Adobe Flash平台上的应用和游戏,因此,A星(A*)算法在AS3中的实现对于游戏开发者尤其有价值。本文将深入探讨A*算法以及在AS3中如何实现这一算法。 A*算法是一种...
5. **算法详解**:教程中可能会详细讲解各种算法,如寻路算法(A*)、物理引擎算法、碰撞检测算法等。这些算法在游戏场景中的应用能提升游戏的趣味性和挑战性。 6. **源代码分析**:通过阅读和分析提供的源代码,...
标题“AS3 A星算法以及实例”表明我们将探讨的是使用ActionScript 3(AS3)语言实现的A星算法。AS3是Adobe Flash平台的主要编程语言,常用于创建交互式网页内容、游戏和动画。 描述中提到这是一个包含源文件和源...
3. code:这可能是一个文件夹,包含了其他的源代码文件,与寻路算法相关的其他类或者支持文件可能就在这里。 4. move.fla:这是一个Flash的源文件,用于创建和编辑动画或交互内容。在这里,开发者可能已经设置好了...
Flex是一种基于开放源代码的、用于构建富互联网应用(RIA)的开发框架,而AS3是Flash平台上广泛使用的编程语言,尤其适合创建互动性和图形丰富的Web内容。 1. **地图加载**:地图是游戏的基础,地图加载涉及将地图...
AS3 AStar优化版是一个基于ActionScript 3(AS3)的A*寻路算法的改进版本。A*算法是一种广泛应用在游戏开发、路径规划、网络路由等领域中的搜索算法,它能够有效地找到两点间的最短路径,同时兼顾了效率和准确性。在...
路径寻找算法,如A*寻路算法,也可能在`hopper`中有所体现。A*算法结合了最佳优先搜索和启发式信息,能够快速找到从起点到终点的最短路径。在Flex中,我们可以创建一个优先级队列,结合曼哈顿距离或欧几里得距离作为...
在压缩包文件名“Five-Chesses-Online-With-AS3-master”中,“master”可能表示这是项目的主分支,意味着它包含完整的源代码和资源,适合学习和进一步开发。 综上所述,这个项目为学习者提供了深入研究Flash游戏...
标题中的“PureMVC_Iso_Astar.rar”指的是一个使用PureMVC框架实现的Isometric(等轴测)空间中的A*(A-star)寻路算法的项目压缩包。这个项目可能包含了源代码、演示以及相关的文档,方便开发者理解和学习。 Pure...