【游戏客户端】浅谈装备系统
大家好,我是Lampard~~
不知道大家一开始接触到游戏里面的装备系统是什么时候,什么感觉。对于我来说,我第一次清晰认知到游戏里面的装备,是我小时候玩DNF。那时候还是老版本,一个紫色的墨竹手镯,粉色的梵风衣,拉风的魔剑,深渊里面的蓝天白云......在我看来装备是非常🐮皮的一样东西。
(下面的DNF图百度得来仅展示使用,侵删)
魔剑阿波菲斯
我也沉迷在强化增幅凑套装中不能自已。在入职半年后,我接到的第一个大需求就是给项目增加一个类装备的一样东西--宝物系统,它是单独存在,但是也能对角色属性产生影响。要类比的话,大概就像是DNF里面的称号。能够接到这个需求我还是十分兴奋的,然后我大致陈述一下我完成装备系统的过程,供大家参考~
(1) 把新装备系统兼容到通用道具中
无论是装备还是碎片或者其他一些消耗品,他们都统统属于道具,要存放在背包里面。所以我们如果要创建一类新的道具首先就需要把它兼容到我们原有的道具体系中,兼容过程不表大家可以根据自己的项目结构进行处理。当我们兼容成功之后,我们的背包类就多出了一个页签,里面展示的是我们所有的宝物道具。
(2) 审视需求单,把功能分成战斗相关和非战斗相关两种
我的主管曾经和我说过,当你要完成一个需求的时候,思考和编码是同样重要的,拿着功能就去过很容易就会踩中自己写的坑里面。所以我的第二步就是把需求单中简单的东西先拎出来,把战斗相关复杂的东西放到后面去做,按部就班。
宝物系统除了能够在背包中展示之外,还拥有单独的界面,里面包含着它合成,分解,重铸属性,上阵,图鉴等功能。宝物在上阵之后还存在着战斗力的影响以及战斗中buff的加成和技能的释放等等的问题。
(3) 非战斗部分功能
图鉴
我们把非战斗的功能一看,诶!好像图鉴好是最容易做的。因为它只是把所有的宝物按类别展示出来。这种UI我们只需要用一个listView把我们的所有的图鉴item类,根据选择的类别做一次遍历push进去就行了。每个图鉴item类还有已获得和未获得状态,这个也简单,只需要在遍历插入的时候根据服务端下发的数据判断一下即可。就这样我们就完成了非战斗部分的5分之一功能了。
合成&分解
合成和分解的原理一样,都是通过查表找到完成功能所需要的的原料和产出,比如说合成一个宝物需要10个碎片,分解一个宝物产出6个碎片等等。我们把界面分成两部分,一个是合成/分解的原料区,一个是合成/分解的产出区,给合成/分解的item类添加触摸事件,每一次点击都会刷新原料区和产出区即可。
如果我们的原料不足我们可以有一些指引和提示,而当我们原料充足的时候,只需要把原料的信息上行给服务端,然后根据服务端回来的协议播放特效,展示结果即可。这里有点像我们之前的抽奖系统的抽奖过程,值得一提的是,我们做客户端的在这种情况下,需要严格依赖服务端的协议来执行操作,比如说假如玩家在点合成的时候刚好进电梯没信号,那么我们不能主动读表展示合成的结果,不然就会出问题了。
在展示完结果之后再刷新一下原料区和展示区就可以啦,这样子我们非战斗类的功能就做了一半了。
重铸属性
我们每一件宝物下会根据资质不同带有不同数量的属性,这些属性的数值是可变的,就像DNF里面同一个装备有分最下级,下级,中级,上级,最上级一样,他们同一属性的属性值都是不同的。对于非战斗部分来说,我们只需要根据服务端下发的协议数值展示上去即可,这块难的还是在战斗的部分,因为我所处的项目一开始是不支持随机属性的。
重铸的时候我们还可以锁住牛皮的属性,对于客户端来说,也只是记录锁住的位置,重铸的时候一起发给服务端即可。所需要额外做的大概就是锁属性需要额外的花费,我们需要对这些花费进行额外的判断,不足就让玩家去冲钱哈哈哈哈哈哈哈~
同理,重铸成功后我们只需要刷新属性的展示界面即可。
上阵
我们每一类的宝物都有3个栏位,就是说最多可以上阵同类三个宝物。每一个栏位都有自己的解锁条件,我们需要把这些解锁条件填在表中,然后再根据表里的内容判断相关模块是否已经达到解锁条件。达到我们就弹出上证界面,里面是背包中的所有宝物,我们只需要按照资质对宝物进行排序,然后分出一块展示宝物的属性让玩家进行判断即可。
因为我们宝物相关的几个功能都分布在同一个层中,那么我们需要注意,如果发生了合成,分解要触发事件,刷新可以上阵的宝物,不然就会出现报错。当玩家点击上阵之后我们要刷新界面以及对玩家整体的战斗力进行计算。
至此我们非战斗类的所有功能都已经完成。
(4) 战斗部分功能
战斗部分能够和大家分享的不多,我只是在计算战斗力的时候,公式中增加了对宝物的计算。然后在战斗开始前下发战斗buff,战斗技能的时候,我需要把随机出来的数值插入其中,仅仅是修改了一些数据结构大多是 沿用项目原有的功能。等我真正的接起一个战斗的大需求才和大家分享哈
至此我们宝物所有功能都已经完成。
说在最后:
在整个系统完成的过程中,我觉得有两块是十分重要的:一个是安全性问题:上文也有提过,我们在进行合成分解升级的时候,一定一定要根据服务端的协议进行操作,不然会造成数据错乱问题大大的。还有就是我们为了减轻服务端压力,不会每一次进行操作后都让服务端把全部宝物数据进行下发,仅仅是下发数据有变化的宝物数据。所以当回协议之后,我们客户端要对数据进行刷新,不要这边刚被分解的宝物又拿去上阵了结果报错了。另一个是玩家体验方面,如何对宝物做好异步加载。不然身上几百个宝物砸下来,如果一次性加载的话,那酸爽QAQ......关于异步加载我会另出一篇博文分享,大家敬请期待。