分享
 
 
 

Flash里的 A* Pathfinding

王朝other·作者佚名  2006-11-24
窄屏简体版  字體: |||超大  

A* Pathfinding,A*寻路,利用这原理可以制作战棋游戏...地图内黑色块为障碍物,白色块为通道,在非寻路状态时点击可以切换.红色块为主角,点击主角再点目标可进行寻路.

PS:寻路是四方向的,人懒就没写八方向了,FLA文件请用FLASH MX2004以上版本打开

演示:

点击这里下载源文件

本作品仅限学习参考使用,您可以随意修改,传播,但不得用于商业用途

以下为代码:

//code by 月光 2005.9.22

//地图长宽

var mapx = 40;

var mapy = 40;

var total = mapx * mapy;

//边界距离

var distancex = 30;

var distancey = 30;

//移动速度

var interval = 75;

//初始障碍物比率

var balk = 3;

var val;

var width = 0;

var height = 0;

//移动次数

var moves = 0;

//是否正在忙碌

var busy = false;

//是否正在移动

var moving = false;

//是否搜索成功

var finded = false;

//路径记录

var open = new Array();

//方向数组 => 右, 下, 左, 上

var ori = new Array([1, 0], [0, 1], [-1, 0], [0, -1]);

// ========================================

//重置

var reset = function () {

clearInterval(val);

for (var i in _root) {

if (typeof _root[i] == "movieclip") {

_root[i].removeMovieClip();

}

}

txt.text = "";

init();

};

btn_reset.onPress = reset;

// ========================================

//初始化

var init = function () {

var i = 1;

// 绘制地图

while (i <= total) {

var tmp = attachMovie("mc", "m" + i, i, {id:i, visited:false});

tmp._x = (i - 1) % mapx * tmp._width + distancex;

tmp._y = Math.floor((i - 1) / mapy) * tmp._height + distancey;

if (random(balk) == 0) {

tmp.gotoAndStop(2);

}

i++;

}

m1.gotoAndStop(1);

width = m1._width;

height = m1._height;

// 主角初始位置

attachMovie("player", "player", total + 10000, {_x:distancex, _y:distancey});

player.onPress = function() {

busy = true;

txt.text = "请选择目标";

};

moving = false;

};

// ========================================

//点击地图后执行

btn.onPress = function() {

if (!moving) {

var i = 1;

while (i <= total) {

this._parent["m" + i].visited = false;

i++;

}

var x = Math.ceil((_xmouse - distancex) / width);

var y = Math.ceil((_ymouse - distancey) / height);

var id = x + (y - 1) * mapy;

//当前点击的MC

var tmp = this._parent["m" + id];

if (!busy) {

if (tmp._currentframe == 1) {

txt.text = "目标转换为障碍物";

tmp.gotoAndStop(2);

} else {

txt.text = "目标转换为通道";

tmp.gotoAndStop(1);

}

} else {

if (tmp._currentframe == 2) {

txt.text = "目标为障碍物,无法到达";

busy = false;

} else {

findit(x, y);

}

}

}

};

// ========================================

//寻路

var findit = function (x, y) {

finded = false;

open = new Array();

var playerx = Math.ceil((player._x - distancex) / width) + 1;

var playery = Math.ceil((player._y - distancey) / height) + 1;

moves = 1;

// 数组内元素为: X坐标, Y坐标, 距离原点长度, 上级位置

open[1] = [x, y, moves, 1];

for (i = 0; i < 4; i++) {

// 邻格内移动

if (x + ori[i][0] == playerx && y + ori[i][1] == playery) {

movefunc();

return;

}

}

// 非邻格内移动

var z = 1;

var t = 1;

while (open[z] != null) {

for (i = 0; i < 4; i++) {

var tmpx = open[z][0] + ori[i][0];

var tmpy = open[z][1] + ori[i][1];

if (tmpx > 0 && tmpy > 0 && tmpx <= 40 && tmpy <= 40) {

var id = tmpx + (tmpy - 1) * mapy;

var tmp = this["m" + id];

// 当对象存在及非障碍物及未访问过时

if (tmp != null && tmp._currentframe == 1 && !tmp.visited) {

tmp.visited = true;

open[++t] = [tmpx, tmpy, open[z][2] + 1, z];

if (open[t][0] == playerx && open[t][1] == playery) {

finded = true;

moves = z;

break;

}

}

}

}

z++;

}

if (finded) {

movefunc();

} else {

busy = false;

moving = false;

//debug

trace(open.join(" => "));

txt.text = "无法到达目标";

}

};

// ========================================

//角色移动

var movefunc = function () {

moving = true;

txt.text = "找到目标,正在移动";

val = setInterval(moveFunc, interval);

};

var moveFunc = function () {

updateAfterEvent();

moves = open[moves][3];

player._x = (open[moves][0] - 1) * width + distancex;

player._y = (open[moves][1] - 1) * height + distancey;

if (moves == 1) {

busy = moving = finded = false;

txt.text = "已到达目标";

clearInterval(val);

}

};

// ========================================

init();

stop();

本帖参考自OReilly的AI for Game Developers这本书的第七章A* Pathfinding,推荐对游戏开发有兴趣的朋友们可以找来研究下.

关于A*算法,也叫A STAR,这里有篇国人翻译的文章:

http://blog.vckbase.com/panic/archive/2005/03/20/3778.html

英文原文地址:

http://www.gamedev.net/reference/articles/article2003.asp

原帖地址:

http://www.blueidea.com/bbs/newsdetail.asp?id=2376491

以下内容为A*寻路初探 GameDev.net,转自Panic的小屋

A*寻路初探 GameDev.net

作者:Patrick Lester

译者:Panic 2005年3月18日

出处:[1] [url=http://www.chinamx.com.cn/Article/websj/flash/flashas/200605/20060516233417_3578_2.html][2] [3] [4] 下一页

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有