SRPG开发之五-敌人AI

不知道是我这里的问题还是LOFTER服务器的问题,总之这边所有人的头像都是看不到了

不过……貌似文字里面的图片还是可见的嘛!所以说应该不会受影响……

好的,那么步入正题

说道AI……很多人第一反应肯定都是终结者啊、Alpha GO啊之类的高级货,或者又和现在火热的深度学习,语音助手Cortana、SIRI之内联系在一起……

但,事实上并没有那么神乎其神——别说我能写了,就算我能够看懂他们AI的算法和代码,我就直接能去各大研究院了!


(嗯,自然是不可能的)


对于SPRG而言,敌人的AI化整为零,大约可以根据敌人的类型,分成以下几种:

  1. 追随型:不断追逐主角,朝向主角移动,同时选择生命值最低的角色优先攻击;当主角进入攻击范围内时,就会被攻击,多为近战种类

  2. 移动炮台型:在固定范围内移动并且对主角进行攻击

  3. 炮台型:固定在原地不断对主角进行攻击

  4. 机关型:受到攻击以后开启机关等等

  5. 地形型:受到攻击之后出现允许通行的新路线

其中,追随型是最基础的类型,移动炮台型的算法与之类似,只在玩家角色不再攻击范围内时才会进行寻路和移动——寻路的目的地,就是玩家角色可以被攻击到的,最近的位置,固定炮台型就更加简单,去掉移动炮台的寻路算法,只是在进入攻击范围之后发射即可

机关型和地形型只需要处理被攻击和被消灭之后的事件即可——例如,河流是有许多的地形型敌人排列而成,而地图实际上绘制的是冰面,只不过被“河水”覆盖罢了,当且仅当在“河流”受到冰属性攻击之后,才会被破坏,该处也相应的被标记为可通行——反映在玩家面前的,就是冰系法术在河流上搭建出了可以通过的冰桥。同理,机关型只需要处理被攻击后的对象坐标变化即可

所以,只需要解决追随型敌人的AI,就可以举一反三的制作出其他种类敌人的AI

好,那么下面开始:

追随型敌人,首先需要逼近主角,如果还是套用主角寻路的方式的话,由于目标点被设置成了主角方块本身,敌人会一直移动,直到覆盖主角为止,这显然是不被允许的,那么, 要如何解决呢?

最开始我的想法,是在主角周边方块创建判定点,随后再根据判定点是否被生成在了障碍区上来销毁判定点,最后根据主角与敌人的坐标关系来决定最终使用哪一个判定点——很烦人是不是?

那么我们重新思考一下——由于寻路是按照步数来进行的,如果不修改代码,敌人会一直移动,直到覆盖主角为止——解决方案显然可得,假设到主角需要行动N步,而敌人每回合允许移动的距离为M,每走一步M-1,那么只需要让敌人在M>0的情况下,移动N-1步就能够高效的解决问题

但是这样会导致目标方块依旧会与主角重叠,影响下一个敌人单位的寻路,该如何处理呢?

(目标方块在N步之中都会处在辅助方块前一步的坐标上,辅助方块不断地朝向目标方块移动,这样就避免了坐标跳跃)

在研究了一个小时,尝试了多种方法之后,我放弃了,决定偷鸡摸狗——

在敌人单位停止移动后,强制目标方块回到敌人单位身下(……)



好的,寻路的问题就算是(强行)解决了,下面就是敌人目标的选择了

敌人选择目标事实上是要对每一个我方单位进行遍历,计算出相关的权值,再选择最优的单位进行寻路与攻击,由于数值系统还没有设计,所以这里暂时仅仅以坐标为判定对象——敌人会朝着距离自己最近的角色寻路

但事实上,在非常复杂的地形中,最近的角色不一定是移动消耗最少的,至于这个问题,暂时不打算解决——反正改一下公式就好嘛!

上一回我们解决了行动序列的问题,只需要将相关的代码复制粘贴即可。这一次,数组中储存的对象变成了权值和单位ID,依旧是对权值排序,随后返回单位ID

  • 权值、单位ID、遍历顺序

有了目标单位ID,将它赋值,调用寻路系统,敌人单位就会自动朝着主角移动,当移动结束,进入攻击范围(鸡贼的我将敌人的攻击范围全部设置成了1,必须近身才能打(逃),在敌人单位周边创建判定点,如果与不可移动区域重叠,则销毁,如果与我方单位重叠,则进行一次攻击

由于攻击系统并未制作,所以仅仅通过提示音来指示是否进行了攻击,以及攻击范围内是否有单位



当然,为了避免算法出错导致整体卡死,在超过一段时间没有计算出攻击目标的话,会自动跳过该敌人的回合……测试的时候卡死了好多次,虽然我一直不知道是啥原因,反正跳过的是敌人回合,对玩家有利,不算bug,嗯

效果还是比较不错的——当然只是在简单地形下,如果是超级超级复杂的地形,恐怕就要出现敌人扎堆朝着近在眼前远在天边的主角单位跑去而门户大开……

这个时候,就需要范围型敌人了……只有在主角进入一定区域后才会开始攻击

好的,在处理完敌人的AI之后,接下来需要制作的,除了其他类型的敌人之外,还有攻击系统,玩家UI,玩家指令系统,获胜条件等等等等……

所以说,还是任重而道远啊!

不过,UI和指令什么的就要简单多了——现在玩家指令都是通过按键来触发的,将条件修改为点击相应按钮应该就可以了……

应该……

至于平滑镜头,我尝试着写了一下……效果不是很好……

应该找一个巨佬的范例来看看……我记得以前在国外论坛上看到过的……

评论
热度(2)

© defisym | Powered by LOFTER