在之前描述的几个场景中的事件,大多数都是玩家处于回合行动时的情形,当玩家本回合可操作的事件都做完后(母舰与所有编队都完成行动&攻击时),该是结束操作换对手行动的时候了。前面提到:点击空域空位置时会取消当前选中的目标,同时背景暗格消失、画面可以滑动,而在此时屏幕下方导航栏里也显示有【回合结束】的按钮。
点击该按钮后系统会依次检查当前我方空域中的单位(包括母舰与编队),是否还有单位回合移动力尚存、是否还有单位未曾发动过攻击,同时还要检查母舰停机坪是否有准备待发的机甲编队,如果有任意一种情况则弹出窗口确认一遍; 没有、或确认结束回合的话进入到AI行动部分。 这里还有个小细节,如果当前战役中有盟军存在时不会立刻显示“敌方开始行动”,而是盟军先手行动,盟军行动完毕后才会显示“敌方开始行动”。 但是实质在我们确定回合结束那一刻就已经是AI行为来接管了,AI接管时的操作阵营顺序为:盟军——灰星军团——海盗军团......
还是遗漏了一件事(我就说过:对于该作的具体分析描述我也亦无明确的条理!),就是当确定结束回合时,这里调用了几个关于我方战斗编队处理的函数,其主要功能是:依照当前单位的燃料剩余将其回合内消耗的移动力补充、同时也恢复其攻击行动力——这将在下回合时体现;另一方面停泊在母舰的舰载机战斗编队,如果之前因为从战场上返回、或在母舰更换过作战机型(这两种行为都使其不能立刻重返战场),此刻恢复准备就绪待发状态;停机坪上的编队如果之前有战斗减员、且所使用机型在备用机库中数量足够,则补充到满编并将全员耐久值修复到正常,燃料补满、战术武器与格斗武器的残弹也同时补满。(倘若所用机型不够则只把编队剩余成员的状态恢复到正常)
这回才总算到了AI行动的那一刻,首先要将执行该能力的作战单位克隆体ID添加到“部队主动方ID序列”中,凭借“空域目标所属”的阵营、找到其“空域目标ID”的对应项,然后完成添加...这个只需遍历“表”类列表数据不难做到,“部队主动方ID序列”添加完成后通知存放着具体行动脚本事件的某个元素(这里放在对话滚动列表_1中)开始执行。
根据“部队主动方ID序列”列表中的战场单位克隆体ID号,依次执行“AI行动过程”函数看起来似乎一点毛病都不犯——只要“AI行动过程”本身没问题就行,然而您稍稍细品一下就会发现有个巨大的漏洞包含在里面。
(灰星的星舰打到本方的机甲战斗编队)
之前的文章中说过:不同阵营间的敌人也会搏命厮杀,而这个“部队主动方ID序列”列表中可能有盟军、灰星军团和海盗军团至少两方并存,一旦攻杀过程中有被先手消灭的部队,轮到它们行动时如何解释? 除此之外敌人的星舰发动主炮攻击时,是不管目标范围内有没有己方部队的,一旦有同伙被卷入消灭掉也会出现同样问题。 好吧! 接下来看看“AI行动过程”函数是如何规避这种情况的.......
首先我们知道最初设定战场上的目标被消灭后,其对应的“表”数据是与克隆体一并删除掉的——包括它的ID在“空域目标ID”列表中的位置,而“AI行动过程”函数首先要验证的就是待执行的“部队主动方ID序列”中,当前ID在“空域目标ID”中的位置,一旦其小于1说明该ID的作战单位已不存在——“死人没有资格攻击”——于是抬走,下一个......简单的就跟闹着玩似的!
“AI行动过程”函数的脚本代码量是所有功能模块中最庞杂的,而且最初时是放在一个战场元素的通知事件中的,后来因为优化提高帧数把它移到功能函数里了,再后来发现问题的根源不在于它放到哪里,但已经这样了......就这么滴吧!
(ps:发现小游戏工具在持续调用函数时,或大量的线性结构连续重复多次后,会出现无法理解的报错!不清楚原因在哪、或者我描述的也不够准确,但是只要将这些工作步骤合理分割后、并尽可能采用通知手段来承接......就解决了该问题。举个栗子吧:老板派张三去查询物价、然后采购物资、再接下来去办理托运...事情虽多但也不存在同步冲突,按理张三一个人完全可以搞定,但他做完头几件事后就摔了耙子、并且放了老板鸽子...而换了种方案,老板派张三去查物价,查完后通知李四去采购物资,然后再通知王五去办理托运......最后一切都圆满完成,很稀奇不?别说什么全局变量或局部变量,测试过多次问题应该不在这里,至于到底是什么原因...反正对我已经不重要了。)
言归正传!这里也只能还是列出“AI行动过程”函数的大概处理顺序:
- 首先将视线聚焦到开始动作的源目标上并让其闪动,说实话:让场景内大量克隆体中的某一个全凭脚本来执行这些事——难度那是相当的大!幸好有通知事件,向所有克隆体发出各种通知消息后,只有符合当前ID号的那一个才能执行。
- 接下来将所有可以攻击的敌方目标ID添加到“敌方目标列”中,根据同自己阵营的差别来添加敌对方,比如:源目标阵营为灰星军团、则我方、盟军与海盗军团皆在“敌方目标列”中,这个添加过程也是靠通知手段由符合条件的克隆体事件执行添加的,相当于喊话:敌人都站出来! 于是敌人纷纷站了出来......
- 通过“敌方目标列”的ID号在“空域目标ID”列中的位置,确定了每个目标的空域坐标(之前说过:这个不是自身坐标),将这些坐标与源目标的空域坐标进行对比,筛选出距离最近的敌方单位。(脚本代码略)
- 从自身的“里”对象数据中按特定规则选出合适的战术武器(前提该武器残弹量大于0),判定最近敌方单位是否在武器射程中,如果是,调用“AI打击动作”函数发动攻击,攻击完成后切换下一个源目标; 否的话,执行移动指令组合。
- 移动指令组合需要根据当前“部队主动方ID序列”中源目标ID的移动力、燃料等参数,加上行动范围格内的障碍物因素来决定其走向。目前移动逻辑基本已经可以绕过不太复杂的地形结构了,这里编队单位因为机动性强、移动格广、更容易绕过障碍物,而星舰就差了很多,有概率被连续排列的几个流星碎片阻住——因为星舰不像编队可以牺牲部分机动性去穿越流星碎片。(ps:我一定忘了说明过,7个战役中的流星碎片分布绝大多数是随机的,敌军在战场上的出现位置也是范围内随机的,就是大概在那一带、具体位置不确定,即使同一个战役关卡战场细节形势都有所不同。)
- 执行完移动指令的源目标还会再次判定下之前的敌对单位与自身的距离,如果射程够了就调用“AI打击动作”函数打之、依然不够就暂时放弃换下一个源目标。
以上就是“AI行动过程”函数大致设计方案了,还是那句话:没有可参照的相关案例资料指引,一切都出于想当然! 不过实际测试时,特别最后一关三方大混战期间,局面乱像也完全不在本人的可预料范围了——结局虽难料但其事件基本合乎逻辑、没有主体规则外的异常发生。 与“AI行动过程”紧密相关的还有“AI打击动作”函数,以及所有AI行动完成后的概率释放派遣战斗编队的行为(这一行为只有星舰单位才具备),
关于这两个方面留到下一篇再来介绍吧!