在家上网赚钱更容易
//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* Pathfinding Project 是一个功能强大并且易于使用的 Unity 寻路系统。通过快速的路径寻找,您的 AI 将立即在复杂的迷宫中找到玩家。非常适合 TD、FPS、RTS 游戏。 支持导航网格,支持3D、2D寻路。
本文将深入探讨A* Pathfinding Project Pro 4.1.16这一Unity插件,它是游戏开发者实现A*寻路的利器。 A* Pathfinding Project Pro是一款由AR Dynamics开发的专业级寻路解决方案,它为Unity引擎提供了强大的A*算法...
A* Pathfinding Project Pro 4.2.15,A星寻路插件,解压出来是一个unitypackage。 插件是一个功能强大并且易于使用的 Unity 寻路系统。通过快速的路径寻找,您的 AI 将立即在复杂的迷宫中找到玩家。非常适合 TD、...
《A*寻路在Unity3D中的应用:The A* Pathfinding Project》 Unity3D作为一款强大的游戏开发引擎,广泛应用于各种类型的游戏制作。在3D游戏中,角色的智能移动、NPC(非玩家角色)的自动导航以及敌人的追击等都需要...
本插件A*Pathfinding Project Pro 4.1.16是针对Unity引擎专门设计的,提供了全面的支持,包括对Unity 2018版本的兼容。 A*算法的核心在于它的启发式搜索策略,结合了Dijkstra算法的全局最优性和Greedy Best-First ...
《A* Pathfinding Project Pro 3.8.6:引领高效寻路的创新技术》 在游戏开发领域,路径寻找是至关重要的一环,它决定了游戏角色如何在虚拟世界中移动,找到从起点到终点的最佳路径。A* Pathfinding Project Pro ...
A* Pathfinding Project Pro是一个功能强大并且易于使用的 Unity 寻路系统。通过快速的路径寻找,您的 AI 将立即在复杂的迷宫中找到玩家。 非常适合 TD、FPS、RTS 游戏。
A* Pathfinding Project Pro 4.2.2(最新版),供大家学习使用。
A*寻路算法因其高效性和准确性而被广泛采用,而在Unity3D游戏引擎中,A* Pathfinding Project Pro 4.1.16则是实现这一算法的优秀工具。 A* Pathfinding Project Pro是由Lars Viklund开发的一款适用于Unity3D的游戏...
本文将深入探讨A*寻路算法以及Unity引擎中的实现项目——"A* Pathfinding Project Pro 4.1.12"。 A*算法基于Dijkstra算法改进,引入了启发式函数,以实现更快速的路径查找。它的核心思想是结合了实际距离(g-cost)...
A* Pathfinding Project 是一个功能强大并且易于使用的 Unity 寻路系统。通过快速的路径寻找,您的 AI 将立即在复杂的迷宫中找到玩家。 非常适合 TD、FPS、RTS 游戏。 支持网格、导航网格、点和六角形图。自动导航...
Unity A星寻路算法插件A Pathfinding Project Pro v5.0.5.unitypackage A* Pathfinding Project 是一个功能强大并且易于使用的 Unity 寻路系统。通过快速的路径寻找,您的 AI 将立即在复杂的迷宫中找到玩家。 非常...
本文将详细介绍Unity中的寻路插件——A-Pathfinding-Project-Pro-v4.2.17,帮助开发者深入理解并熟练运用这一插件。 A-Pathfinding-Project-Pro是专门为Unity3D设计的一款高级寻路解决方案,它的最新版本v4.2.17...
《Unity 2D Astar寻路导航包:A Pathfinding Project Pro v4.2.2详解》 在游戏开发中,角色智能移动是一项至关重要的技术,它使得非玩家角色(NPC)能够在游戏环境中自主地寻找路径,实现动态的、合理的行动。Unity...
10. **教程与支持**:作为一个专业项目,A* Pathfinding Project通常会提供详细的文档、示例场景和社区支持,帮助开发者快速上手并解决实际问题。 综上所述,A* Pathfinding Project 4.2.15为Unity开发者提供了一套...
《A*寻路项目专业版4.2.15》是一款专为Unity引擎设计的高效路径寻找解决方案。这款工具在游戏开发中起着至关重要的作用,尤其对于那些包含大量动态对象和复杂环境的游戏,它提供了智能且快速的寻路算法,帮助游戏...
4.2.18 (2022-11-08) 此版本包含已从 4.3 测试版向后移植的修复程序和功能。... 添加了一个关于包架构的文档页面:Architecture overview。 添加了有关从 Unity 的寻路迁移到此包的教程:从 Unity 导航迁移。...
unity寻路插件在此大家准备的是Unity a*寻路插件,即为a pathfinding project pro.unitypackage是在unity游戏制作中经常使用到的自动寻路算法插件,实现了最短路径寻路效果,使得游戏角色能够快速的寻找到目标地点,...
A-Star-Pathfinding-for-Platformers, 如何适应基于 2D 网格的A*定位算法 ###Tuts+ 教程:如何将A*查找调整为基于 2D 个网格的Platformer ####Instructor: Daniel Branicki本系列教程将解释如何通过考虑重力限制垂直...