一、实验目的与要求
1. 理解A*寻路算法原理。
2. 进一步熟悉地图编辑器的使用。
3. 实现游戏中的人工智能。
二、实验内容与方法
1.完成游戏编译(5分)
成功编译并运行教材P200“游戏AI实例-迷宫寻宝”。
2.完成修改内容一 (5分)
修改游戏代码,实现修改内容一,即修改窗口大小。
3.完成修改内容二 (10分)
修改游戏代码,实现修改内容二,即增加DANGEROUS区域。
4.完成修改内容三 (10分)
修改游戏代码,实现修改内容三,即增加按键监听。
5.完成修改内容四 (10分)
修改游戏代码,实现修改内容四,即增加地图层次。
6.完成Bug修改(5分)
通过更改游戏代码的方式修复BUG,如:点击笑脸出现“No Way” 和“Found Treasure”的叠加。
7.添加配乐、音效(5分)
为游戏添加配乐、音效。
8.增加粒子特效(5分)
为游戏添加粒子特效。
9. 游戏优化升级(5分)
自行发挥想象力,优化游戏功能。
10.完成实验报告 (40分)
截图记录关键步骤,分析实验结果,撰写心得体会。
三、实验步骤与过程
1.完成游戏编译
把第11章的code和resource放到游戏目录下进行编译运行。
图1-编译运行
2.完成修改内容一
在AppDelegate.cpp内修改窗口大小为(1024, 768)
图2-更改窗口大小对应代码
同时把标题修改为姓名+学号,关闭左下角FPS显示。
图3-完成修改内容一
3.完成修改内容二
任务:随机增加DANGEROUS(危险)区域,当移动的终点在危险区域或移动路径经过危险区域时,提示DANGEROUS。
3.1 随机增加危险区域
在不是墙的位置(可通行位置)上,随机生成危险区,并更换显示的图片。
图4-添加危险区域
3.2 识别危险区域
在A*算法内,增加对is_Dangerous的识别。如果路径中出现了危险区,则结束搜索并显示失败的动画。(Dangerous! You're Dead!)
首先在生成路径节点的时候加入对危险区域属性的判定。
图5-存储节点危险区域信息
然后如果搜索路径中的当前节点是危险区域,则结束搜索。
图6-发现危险区结束搜索
然后就在屏幕中央展示死亡的提示。
图7-遇到危险死亡提示
图8-死亡提示
4.完成修改内容三
当游戏提示No Way或DANGEROUS后,按下R键,使游戏重新开始。
首先设置一个全局变量is_over表示游戏是否结束(出现No Way或Dangerous),然后设置一个键盘监听器,当按下R键是检查is_over是否为true,若是则使用replaceScene函数重新加载本局游戏。
图9-添加按键监测
5.完成修改内容四
将迷宫地图设置为两层,每层均有楼梯,并且两层地图可以互通。
在第一层设置上行楼梯,在第二层设置下行楼梯。楼梯数量为2个。
对于多层而言,每一层除去首尾层后应该是1个上行楼梯1个下行楼梯,但由于只有2层,也就无所谓了。
首先创建第二层迷宫的地图。
图10-第2层地图
把第二层的墙的gid加入NOT_ACCESS的检测。定义一下#define WALL 222,然后在initMap函数里的判断是否通过里加上m_mapLayer->getTileGIDAt(Vec2(i, j)) == WALL。
接下来就是实现楼层的切换。使用一个全局变量FLOOR记录楼层,每次上下楼(通过楼梯)时改变s的值,然后
图11-第二层地图相关代码
6.完成Bug修改
Bug:点击笑脸时候出现No Way和Found Treasure的叠加。
解决方案:对笑脸位置特判,禁止以笑脸为终点。
图12-特判笑脸位置
现在如果点击笑脸就会出现禁止图标。此处使用m_origin而不是m_destination,因为m_destination要在下面的代码块才赋值,现在只是一个初始值nullptr。就算加入空指针检测,在初始的左上角位置点击笑脸仍然会出现No Way和Found Treasure的叠加,因为此时m_destination是空指针。
图13-修复笑脸bug结果
7.添加配乐、音效
配乐:第一关,第二关bgm,共2首。素材来源于魔塔。其中,上下楼会切换音乐,同一层楼因为No Way和Dead后按R重开则音乐照常播放,保持连续。
音效:移动,上下楼梯,共2个。
图14-背景音乐设置
图15-音效设置
8.增加粒子特效
通过文件创造粒子特效,设置其位置居中,添加到当前场景内。
图16-粒子特效设置
9. 游戏优化升级
9.1 整体美观设计
在地图下方标注当前楼层。更换笑脸素材为流汗黄豆。
图17-显示当前楼层
图18-流汗黄豆素材
四、实验结论或心得体会
心得体会:本次实验整体并不复杂,主体的寻路算法已经实现无需自己做什么,主要就是修修补补一些bug。如果要做的复杂一些,就可以仿照魔塔,设置数值系统。不过在魔塔里,自动寻路不过是一个非常次要的功能,真正复杂的是数值计算。如果把那一套搬到这个实验里,加点怪物,血瓶,不仅工作量太大,感觉也和实验本身的要求不太符合。
演示过程:
- 点击自己:出现禁止通行标志,无标签显示。
- 点击一个封闭方块:出现No Way,然后按R重启
- 点击一个需要穿过危险区的方块:路线在危险区停止,然后出现Dangerous!You’re Dead! 然后按R重启。
- 点击楼梯:楼梯处不出现宝箱标志。移动到楼梯后切换楼层,此时播放上下楼音效,切换背景音乐。
- 在第2层继续演示一遍
- 下楼到第1层