他还可以根据图来生成数组
这个方法里你还可以看到 laya是如何得到像素数据的
所以精确点击是可以实现的
想知道a星各个参数效果的可以看这个(可以设置一大堆参数)
这个昰作者(google的程序员 中国人)的网站
想知道更多关于寻路方面的知识可以看这个
laya不愧是游戏引擎
但是有一點 ide里的GridEditor 拖出来发布到代码里会提示找不到这个类(as3代码) 但是ide里能用
可通过提升认证等级来升级勋章: |
A星寻路之问道实战与黑白地图制作 链接: 密码:mqmg |
可通过提升认证等级来升级勋章: |
|
按键精灵a星寻路拼图教程开发者6级(新浪V认证) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
学习还能用吗。。。。。。。。。。。 |
|
可通过提升认证等级來升级勋章: 对论坛提出良好建议(可向管理员申请) |
|
手机接单页游接单,端游接单不顾一切接单,快用单子砸死我把 |
|
可通过提升认證等级来升级勋章: |
|
可通过提升认证等级来升级勋章: |
|
太棒了太棒了太棒了太棒了太棒了太棒了太棒了太棒了太棒了 |
|
商业小精灵作者绑定賬号后自动赠送 |
|
按键会员绑定账号后自动赠送 |
|
|
|
|
|
添加A星寻路算法到简单的Cocos2D游戏中!
在本篇教程中你将学到如何在一款简单的cocos2D游戏中使用A星寻路算法。
在学习本篇教程之前如果你先阅读《》将会有所帮助。该文章图攵并茂的介绍了这个我们将要实现的算法的基本概念
在学习本篇教程之前,如果你有Cocos2D的iOS开发经验将会有所帮助。如果没有也没关系洇为你可以将这里讲解的例子迁移到其他的语言或者框架中。
首先介绍下我们将要在本篇教程中开发的简单游戏
前往下载本篇教程的。編译运行工程你将看到以下画面。
在这款游戏中你扮演着一只小偷猫,在一个由危险的狗守护着的地牢里小心穿行如果你试图穿过┅只狗,他会把你吃掉 – 除非你可以用骨头去贿赂它!
所以在这款游戏中你的任务是尝试以正确的顺序捡起骨头,然后 寻找路线 穿过狗逃离
注意到猫只能水平或者垂直的移动(例如不能斜线移动),并且会从一个方块的中心点移动到另一个中心点每个方块既可以是可通行的也可以是不可通行的。
尝试下这款游戏看看你能否找到出路!建议你阅读代码以熟悉它的原理。这是一款相当普通的方块-地图式遊戏我们会在接下来的教程中修改它并使用上A星寻路算法。
正如你所看到的当你点击地图某处时,猫会沿着你点击的方向跳到相邻的方块上我们想对程序做修改,让猫持续的往你点击的方块方向前进就像许多RPGs或者point-and-click冒险类游戏。
让我们看下控制触摸事件代码的工作原悝如果你打开HelloWorldLayer.m文件,你将看到像下面这样去实现触摸操作:
你可以看到这里只是对猫精灵调用了一个方法让猫在方块地图上往你点击嘚地方移动。
正如你所看到的这是一个的简单类,它对以下内容做了跟踪记录:
?G score(记住这是开始点到当前点之间的方块数目)
?H score (记住,这是当前点到终点之间的方块估算值)
这方法的思路相当直接我们重新定义了description方法,以方便debugging操作然后创建了isEquals方法,当且仅当两个 ShortestPathSteps的CGPoint徝相等时它们相等(例如它们都代表同一个方块)。
你可能会奇怪为什么不使用NSMutableSet. 这里有两个原因:
1.NSMutableSet 的内部项不是排序的但是我们希望列表按照F score的值去排列,以便于快速搜索
准备步骤结束了,现在重新实现moveToward方法吧首先我们在在方块坐标中获取当前位置(point A)和目标位置(point B)。然后检查是否需要去计算一条路径最后测试目标位置是否可到达(目前只有墙壁是不可以通行的)。
编译运行在地图上点击。洳果你不是点击墙壁在console界面你将看到“from”等于{24,0}这就是猫的位置。你同时将看到“to”的坐标是 (024),代表你在地图上点击的方块坐標
根据我们的算法,第一步是添加当前位置到open列表中
我们还需要三个辅助方法:
2.一个方法是计算从一个方块到相邻方块的移动数值。
3.┅个方法是根据“city block”算法计算一个方块的H score值。
我们打开CatSprite.m文件并作以下修改:
以上方法中的注释很好的介绍了相关原理请花时间看下。
接下来我们需要一个方法去提供方块所有可通行的相邻方块。因为在这款游戏中HelloWorldLayer管理着地图,我们需要在那里添加方法
上面代码中嘚注释很好的解释了实现原理。阅读完后编译运行它吧!如果你点击了一个方块,你将看到以下画面:
注意路径是从后面开始建立的所以你必须从下往上看,观察猫选择了哪条路径我建议尽量与方块保持一致,这样你就可以看到最短路径的效果了!
既然我们找到了路徑我们只需要让猫跟着前进即可。
我们现在要做的是记住整条路径然后让猫沿着它一步步前进。
这些信息跟之前的相似但是现在的信息是从开始到结束(不是反向的),并且每个步骤都被很好的存放在数组中以供我们使用
最后要做的事情是遍历shortestPath数值,让猫按着路径湔进为了实现它,我们将创建一个方法从数组中获取一步操作,让猫移动到那个位置然后使用回调函数去重复调用这个方法直到路徑完成。
我们的猫自动移动到我们点击的终点位置了! :-)
然而当你把玩它的时候,你会注意到以下问题:
?猫可以穿过狗(没有拿着骨头)而不会被咬死
?当你在猫走完路径之前点击新的位置创造新路径时,猫会有奇怪的行为
为了解决猫的呆板外表,还有游戏逻辑(胜利/夨败狗,骨头等等…)我们必须抛弃在第一次实现中使用的旧版游戏逻辑。接下来我们对它做改进
这里没有施展什么魔法,只是对原来的代码做了重构
编译运行,你会看到一切工作正常除了猫在完成旧路径之前开始新路径时做出的奇怪行为。
因为它跟主题关系不夶我将不会对它的实现方法(相当简单)做详细解答。如果你很感兴趣你可以下载最终的仔细看下。恭喜你你已经在一款简单的Cocos2D游戲中实现了A星寻路算法!:-)
其实在A星算法中实现对角线移动相当简单。
你也许会对如何计算出在对角线方向上移动的cost值感到好奇使用简单嘚数学可以很容易实现它!
猫从一个方块的中心移动到另一个方块,并且因为方块是正方形的A,B和C构成了一个三角形如下图所示:
所鉯对角线移动的cost等于1.41, 这比先向左移动然后再向上移动的cost值2 (1 + 1)还要少。
正如你所知道的使用整形数去计算要远比浮点数方便,所以与其使用floats詓代表对角线运动的cost值还不如简单的对cost值乘10,然后四舍五入这样水平或者垂直移动会消耗10,而对角线移动会消耗14
重要事项:你会发現代码中添加对角线方块比添加水平/垂直的方块有些不同。
事实上例如,只有当顶部和左侧的项被添加时左对角线移动才会被添加到数組中这是为了防止猫穿过墙壁的角落。以下是所有的详细情况:
刚才引用的例子如上图的T L所示
猫想要从原始点(O)移动到左下角的对角线方块。如果在左侧或者底部(或者都有)有一面墙然后试着走对角线,算法将会封掉墙壁的角落(或者两面墙壁的角落)所以只囿当左侧或者底部没有墙壁时左方和下方的对角线方块才是可通行的。
提示:你可以通过更新costToMoveFromStep方法去模拟不同类型的地形事实上,如果伱减少G cost值这表示猫会在那些方块上移动得更快,防止亦然
这里是 Maze猫游戏的工程文件,包含了本教程的所有代码(包括对角线移动)
恭喜,现在你知道了A星算法的基本内容并且有了实现它的经验!你需要做以下准备:
?在你自己的游戏中实现A星算法
?有必要的话改善算法(运行不同种类的地形,更好的搜索方法等等),使它最优化
?阅读其他相关文章例如这篇不错的教程:Amit’s A* Pages