空域战场的数据结构与图形精灵搭建----这样是不是有点太突兀?可是从哪里说起好呢?
空域战场设定为24×24格范围,每一格可容留一个战场单位,即:敌方单位、我方单位及大小流星碎片。每种单位的精灵由若干造型构成,分别代表太空战舰、作战编队或其它造型,这里精灵本体是隐藏状态,随初始化战场数据分别克隆并显示在特定的位置,这样每个战场单位克隆体要拥有一系列独有的数据,来支撑其存在的实际意义。我们这里赋予它们 “表” “里” 两种数据结构。
“表”所包涵的特征主要作用于战场中的名称、显示的位置(坐标)、面向(方向)、空域目标ID,这些对于流星体等不参与战斗的单位基本足够了,如果是战斗单位还要加上:归属阵营、 回合移动力、燃料值、动作标志和对象定位。这些特征均由列表形式同步读写,方便采用遍历模式查找,比如当我们点击其中一个单位,则该单位点击事件中可以根据自身ID在 空域目标ID 列表中的位置,来同步定位其他的数据......怎么说呢?看看下面的例子。
假设点击我方一个战场单位准备移动走位,那么需要满足诸多刚性的前提要求,其中本回合移动力要有、当前自身燃料要足够,那么就用自身ID在“空域目标ID”列表中的位置,来确定“空域目标机动”列表中相应位置的数据是否大于0;同时也用这个位置来确定“空域目标燃料”列表中的相应位置数据是否大于0,它的ID在“空域目标ID”列表中的位置,在所有“表”类数据列表的同样位置处,就是专属于它的基础数据。(我只能描述到这种程度了)
“里”数据结构专用于实际作战单位,它采用的是对象数据,单位的具体舰机型号、5属性(耐久攻防命中闪避)、武器种类、残弹量等都在这里。太空舰类型稍微简化些,但作战编队则额外庞杂,因为要有各个编队成员的独立数据来应用于格斗战场时的处理。“表”与“里”的关联处就在“表”数据的“空域对象定位”列表中,还是用之前的例子:被点击的单位可以用自身ID在“空域目标ID”列表中的位置,来确定“空域对象定位”列表中对应位置的“里”数据对象。
说起来对象数据比列表数据涵盖面广、使用灵活,甚至表格也远不及它,但还是那句话:循环遍历数据麻烦!当然也不是不能,比如说本作中的“里”数据结构采用了60个独立的”作战队“对象数据,再将它们归属于同一个作战对象内,遍历时可采用:作战对象-作战队1、作战对象-作战队2.......来处理,但有些东西还是非列表不成,比如当某战场单位爆炸消失清理数据时,可以很容易地将其ID在“空域目标ID”列表中的位置相同的其他“表”数据一并删除,然而“里”数据则只能标记该对象为“空置”,不能简单地用删除了事。(ps:为啥呢?我暂时还解释不了)
一个战场单位的建立要经过一系列初始数据赋值后才能克隆到场景中,首先从该战场数据表中读取 名称、归属、坐标(可以设为定点也可以设为范围)、出场回合数、对话内容、是否BOSS等内容,接下来:
1.将名称、归属、坐标先添加到“表”数据的对应列表中;(这里的坐标是X、Y拆开的,另外也不是实际坐标,是24×24单元格的位置,实际坐标要与背景格相对位置经过换算后得出)
2.根据名称在“战舰属性”和“编队属性”表格第一列的位置来判定是否属于作战单位,如果是,则建立其关于“里”的对象数据,“里”对象数据在建立的同时还会补充“表”的其他相关数据,比如:机动性、燃料值、和反相锚定“里”数据的“空域对象定位”列表。
3.克隆该单位,并在克隆同时进一步完善“表”数据,比如:将自身ID添加到“空域目标ID”列表中,此外由名称和归属来决定该单位采用哪种造型。
以下就是我方单位的几种对应造型。
可能有的朋友会觉得这样处理过于庞杂,但是对于作者而言实属迫不得已!因为这种大场面回合制的单位不像某些空战游戏的元素,来也匆匆去也匆匆,只要把碰撞系的事件处理好,转瞬就消失无踪了。它们每一个在战场上都有多种自身属性的加成减免、武器、备弹量、伤害判定...哪一个都离不开这些数据的支持! 需要承认一点:这里应该有几处数据是冗余的,但是由于开发的条理性较差,我也不敢确定在实际运行中有没有调用它们的地方,比如单位名称在“表”与“里”的数据中都存在,但后续运算时有从“表”中取值、也有从“里”中取值的,反正没占多点资源无所谓了。
站在实用角度来说,只要这些设置能达成想要的效果就行了,您能想到哪里就尽管去做到哪里,刚做完大概率根本不管用或不能用,但改着改着就慢慢能用了,甚至最终能用的时候,代码与刚开始做的完全不同,然而没有开始就没有最终的能用!
战场上的元素分布于整个空域内,我们能看到的却只有这么个小小的屏幕范围,所以这里采用滑动屏幕来查看战场全局,说到这就必须提到的战场单位坐标问题了,实际上战场的所有单位(包括流星体)坐标都是相对于背景星域画面的,背景星域画面有一个大小一致始终同步的空域暗格相随,当点击选中目标时暗格显现,此时滑屏暂时禁用;当点击空位置时暗格消失,重新恢复滑屏功能。
按住画面滑动准备查看战场时,会先通知所有战场元素同步信号,此刻战场元素会依照“表”数据的坐标与背景星域画面保持同步移动,无论何时当暗格出现时,你会发现所有可见的单位都在各自的空域格中,没有“压线”的违规现象。
需要说明一点:当停止滑屏时会自动终止各战场元素的同步行为,否则系统会在几分钟后陷入卡顿,战场元素越多卡顿越明显,这也可能还是碰撞检测与条件检测的专属通病,最初设计时战场元素都是自动同步背景星域画面的,但在AI行动执行中掉帧到20左右简直无法忍受,而现在的设计则几乎感觉不到。
下一篇讲一下关于单位移动及障碍物对其影响的处理方法吧!
有FC游戏机器人大战的味儿了