- 浏览: 48410 次
- 性别:
- 来自: 杭州
最新评论
曾经写过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
发表评论
-
从html链接调用ActionScript函数
2010-04-10 14:29 660从书上刚了解这个asfunction这个东东时,感觉发现新大陆 ... -
精美全Flash个人网站的制作全程解析
2010-04-10 14:29 634原文件下载地址: http:/ ... -
精美全Flash个人网站的制作全程解析
2010-04-10 14:28 591原文件下载地址: http:/ ... -
用flash打造电子地图实战
2010-04-10 14:28 1138关于flash,大家或多或 ... -
Flash Media Server 起步(13)再说说SO....onSync(list)
2010-04-10 09:49 517很早以前写过so,当时 ... -
FlaMplayerV3里应用到的小技巧:加载缓冲
2010-04-10 09:48 569"var t0 = FMSound.getBytes ... -
FlaMplayerV3里应用到的小技巧:加载缓冲
2010-04-10 09:48 562"var t0 = FMSound.getBytes ... -
最新利用FMS做在线视频录制教程
2010-04-10 09:48 648这程序写的挺简单的..不懂的呢,可以参考下..高手就别笑我了. ... -
最新利用FMS做在线视频录制教程
2010-04-10 09:48 561这程序写的挺简单的..不懂的呢,可以参考下..高手就别笑我了. ... -
我对as3声音架构的理解
2010-04-09 12:44 500一直都对as3的声音架构 ... -
as3.0游戏开发之打气球系列(一)
2010-04-09 12:44 495好久没有写正经的文章 ... -
as3按钮事件
2010-04-09 12:44 594在刚开始学As3时,如果不知道按钮的事件如onPress的话 ... -
【as3】ActionScript 3.0体验试教学视频教程
2010-04-09 12:43 655很不错的视频教程 原文地址: http://blog.sina ... -
as3 使用sound类(翻译)-暂停和继续播放声音
2010-04-09 12:43 533[1b]问题十[/1b] 如何暂停声音,如何从暂停的地 ... -
扇形变圆形并设置为图片的遮罩
2010-04-09 08:23 847[ 制作思路 ] 复制小扇形并逐渐旋转成一个圆 [ 知识点 ] ... -
扇形变圆形并设置为图片的遮罩
2010-04-09 08:23 1122[ 制作思路 ] 复制小扇形并逐渐旋转成一个圆 [ 知识点 ] ... -
flash游戏开发中的人物走动实现方法
2010-04-09 08:23 756由于AS3的推出和网速的 ... -
flash游戏开发中的人物走动实现方法
2010-04-09 08:22 984由于AS3的推出和网速的 ... -
跑动的小火柴人(flash动画)
2010-04-08 07:48 512本教程描绘的是完全用ActionScript做的一个火柴棍小人 ... -
xmlConnector + MenuBar 菜单
2010-04-08 07:48 580使用actionScript写过 [url=http://w ...
相关推荐
AS3最好的A*寻路算法 (优化去除多余拐点并能寻找障碍最近可行走点)
ActionScript 3.0基础教程书中所有的as3源代码
Flex 3.0 ActionScript 3.0源代码 Flex 3.0源代码。 --------------------------- 第1篇 Flex技术概述 第1章 Flex概述 3 1.1 Flex简介 3 1.2 Flex的技术框架 4 1.2.1 MXML语言 4 1.2.2 ActionScript语言...
Learning ActionScript 3.0, Second Edition源代码Learning ActionScript 3.0, Second Edition源代码Learning ActionScript 3.0, Second Edition源代码
ActionScript 3.0 开发技术大全源代码.zip
第3章 ActionScript3.0语法 第2篇 ActionScript3.0面向对象特性 第4章 ActionScript3.0面向对象编程 第5章 ActionScript3.0中的String对象 第6章 ActionScript3.0中的Array类型 第7章 ActionScript3.0...
actionscript3.0开发的进度显示条项目
最专业的最专业的最专业的ActionScript 3.0 ActionScript 3.0 ActionScript 3.0 ActionScript 3.0 ActionScript 3.0
一个简单的例子,清楚地说明使用Action Script3.0如何在网页中实现全屏,可用于播放器。
ActionScript 3.0 as 组件 编程 中文 ActionScript 3.0 as 组件 编程 中文
《ActionScript 3.0 语言和组件参考》概述 《ActionScript 3.0 语言参考》是 Flash® Player 和 Adobe AIR™ 应用程序编程接口 (API) 的参考手册。 此版本包括支持 Adobe AIR 运行时环境的新 ActionScript 类、...
一个关于用ActionScript3.0的图片3D旋转代码!
Flash.ActionScript.3.0动画教程源代码
本书全面介绍了ActionScript 3.0的基本语法、类的架构以及面向对象程序的设计理念。内容安排上既适合刚刚接触到ActionScript脚本语言的初学者,也照顾到学习过ActionScript之前版本有一定编程经验的读者。 鉴于...
ActionScript 是由 Flash Player 中的 ActionScript 虚拟机 (AVM) 来执行的。ActionScript 代码通常被编译器编译成“字节码格式”(一种由计算机编写且能够为计算机所理解的编程 语言) ,如 Adobe Flash CS3 ...
ActionScript3.0 中文版 ActionScript3.0 api 中文版说明文档
《精通FLEX3.0-基于ActionScript3.0实现》源代码
本书详细地介绍了 actionscript 3.0的基础知识,包括 actionscript 3.0语言、actionscript 3.0对象的操作方法、显示列表的使用、事件模型、加载外部素材、可视化编程以及利用声音和视频增强应用程序等方面的知识,并...
Flash.ActionScript.3.0动画教程,所带例题全部源代码。