zoukankan      html  css  js  c++  java
  • Buff系统设计

    我就随便一写,你也就随便一看吧。
     
    1. 什么是BUFF?
     
    或许直接回答这个问题,那么你收获到的答案将是五花八门的。这个问题暂时放下不谈,我们可以去看其他的游戏应该是怎么设计的。
    我经常玩的游戏里边BUFF提现的比较明显的,可能只有英雄联盟了,如果你不熟悉这个游戏,我也会对于每一个状态做出解释,所以我想我们还是可以讨论到一块去的。
    先整理一下,游戏里边可能会被认为是做Buff或者你也觉得那个可能并不是个BUFF的东西全都收集起来,然后逐个来分析。
     
    蓝Buff(提高回蓝速度,减少CD):我想首先应该拿出来说的就是这个了。当你身上持有这个Buff的时候,你将会持续的加快回蓝速度,并且,你的技能的CD时间会变短。从这个地方我们不难看出BUFF的基本作用就是#提高回蓝量,减少CD时间#。
     
    红Buff(攻击别人时,别人会持续掉血):这个还相对特殊一些,因为这个BUFF是提高伤害的,他时怎么提高伤害的呢?如果你携带这个BUFF普通攻击或者使用某些可以出发特效的攻击,就可以给对方添加一个持续伤害的BUFF(隔一段时间掉血的),从而提高伤害输出。BUFF可以#响应普通攻击#。
     
    女妖面纱(阻挡下一个技能):这个你可能觉得并不算是一个BUFF,他属于一个技能的特效。这个我们可能真的比较难定义,毕竟都可以实现。逻辑上呢,也都可以说的过去。那么我们就看一下究竟怎么来处理比较方便。就算不是,我们也可以看一下BUFF系统有没有类似的需求。BUFF可以#响应技能触发#
     
    莫甘娜的E(免疫所有的魔法效果):收到魔法伤害时,护盾值可以替换血量消耗。可以让所有的魔法效果失效。BUFF可以#响应血量消耗# #响应技能触发,并使之失效#
     
    引燃(持续伤害):接受这个BUFF的时候,你的血量就会在一段时间内,持续掉血,一秒掉个N多滴。并且,会添加一层重伤效果。BUFF可以#修改自身血量#。
     
    重伤(回血效果减半):接受这个效果的时候,再调用回血的逻辑时,回血的数量将减少一半。BUFF可以#可以响应加血逻辑#
     
    禁锢(没有办法移动):接受这个效果之后,你将不可以移动,只能呆在原地。BUFF可以#禁止本身的某一段逻辑运行#
     
    眩晕(没有办法移动,并且自己也没有办法主动普通和大部分其他效果):接受这个效果时,你将不可以移动,并且大部分普工和技能没有办法触发,当然也有例外,比如说蛮王的R可以在眩晕的时候主动开启。BUFF可以#禁止普攻,禁止技能释放#
     
    减速(没啥好说的):就是减速。BUFF可以#降低自身移动速度#
     
    减伤(自己的输出会降低):就是,物理输出或者魔法输出会得到对应的降低#可以参与到输出的逻辑#
     
    净化(解除恶意效果):禁锢、减速(这个记不清有没有,姑且这么写吧)、中毒、重伤、持续掉血等等。那么这个属于BUFF吗?我个人认为不是的,但是这个肯定跟BUFF有关系,姑且列上来。BUFF系统可以#根据类型消除恶意的BUFF#
     
    水银饰带(解除眩晕):可以根据消除某一个固定类型的BUFF。BUFF系统可以根据#消除禁锢类型的BUFF#
     
    ……
     
    其实可以分析还有很多。姑且先说这么几个吧,然后总结一下BUFF究竟是什么。
    除了女妖面纱是永久存在的以外(净化和水银饰带属于技能),其他都是在几秒或者几十秒之后就会恢复正常。那么我想BUFF可以这么定义:持续一定时间(永久也是一定的时间),并且可以修改自身属性和相应自身的某些时间的状态集合(一个BUFF可能携带多个效果)的,叫做BUFF。
     
    BUFF逻辑有以下部分:有一定的时间(永久或者某一段时间)、修改自身属性(加速、减速、回血速度、减少CD时间等等)、参与部分逻辑的运算(重伤、眩晕、减速、不受技能效果等等)
     
    好了,下面进入正题,怎么来设计BUFF系统。
    先提出几个问题:
     
    1. 同一个BUFF,可以重叠吗?(比如减速跟减速、引燃跟引燃)
    2. 如果两个同样的BUFF并存,那么数据上应该怎么计算?UI上怎么表现?
    3. 不同的技能可以打出同一个BUFF吗?(比如持续伤害跟持续伤害)
    4. BUFF需要怎么跟其他的BUFF交互(比如说:存在引燃的时候加血、存在重伤的时候加血、存在引燃的时候引燃)
    5. 不同的BUFF是怎么重叠的?(比如、减速跟减速、加速跟减速、引燃与引燃)
    6. BUFF之间存在优先级吗?(比如女妖面纱和轮子妈的E同时存在时,先触发哪个效果)
     
    然后,我来说一下我对应英雄联盟处理的理解,顺便回答一些这个问题,并且附带部分实例以及我对于这些实物的理解。
    1. 同一个BUFF可以重叠吗?答案是逻辑上肯定是允许的,但是有些在业务上是不被允许的。
      1. 先说一个相对容易理解的,减速效果基本上可以跟其他的任何效果重叠,包括其他的减速效果。比如,英雄A给你一个减速效果(比如说炼金术师的那个黏黏的技能),这个时候英雄B给你一个减速的效果(比如说蛮王的嘲讽)。这个时候你肯定是被双重减速的。如果英雄B的技能比英雄A更加弱,不论是替换也好,还是没有效果也好,都不能达到很好的游戏效果,所以这个地方肯定是并存的,减速效果。
      2. 引燃跟引燃是替换式的(就是后一个会替换前一个的)。这个为什么是替换式的效果,你能想象一下,如果对面五个人一级的时候。抓人会有多容易吗?五个点燃,一人A一下,此人必挂。为了可玩性这种技能只能做成替换性。
      3. 持续伤害上有没有并存式的?也有,比如说中毒效果。就应该是并存式,不可能因为后边中了其他类型的毒就会顶替掉前边的中毒效果
      4. 总结:BUFF系统上再设计的时候是肯定允许同一个BUFF同时存在的,至于业务上就看具体的业务室怎么回事了
    2. 如果两个同样的BUFF并存,那么数据上应该怎么计算?UI上怎么表现?
      1. 两个BUFF并存的时候,在数值的计算上应该是以某种方式进行叠加的,比如说减速效果的叠加。UI上则需要根据对应的业务来进行相应的处理,如果需要重点表现出这个BUFF的来源,或者对应的倒计时的这种情况下,则应该分成两个不同的UI来表现,如果仅仅表示自己是存在这个BUFF的情况下,则应该将两个BUFF合并起来表现
      2. 并且,一个BUFF的一部分效果被取消时,BUFF还应该是存在的,直到这个BUFF的所有效果完全消失时,才算整个BUFF消失掉
    3. 不同的技能可以打出同一个BUFF吗?
      1. 这个需要看具体的业务需求,如果是业务需求是同一个BUFF那么就是同一个BUFF。
      2. 其实这个问题更多的时候问的是一种状态,比如说,中毒跟引燃是不是共同引用了同一个状态?毕竟他们除了UI以外,其他的效果基本上可以说是一模一样,所以在BUFF上他们属于不同的BUFF但是实现的业务逻辑上他们可以使用同一个持续伤害的状态实现。
    4. BUFF需要怎么跟其他的BUFF交互
      1. 应该先定义下一下BUFF的交互都包含哪些:BUFF相互的影响(存在重伤效果时,治疗效果减半;存在免疫魔法效果时,魔法没有效果只有伤害;存在格挡时,下一次受得普攻无效;减速效果的叠加)、BUFF的替换(引燃之间的相互替换、中毒效果的层数叠加)、BUFF的消除(技能消除BUFF、BUFF之间的抵消)
      2. BUFF相互影响:这个可以通过修改自身数据来修改,比如说,治疗时候的治疗系数(治疗的时候可以通过这个系数来控制质量血量)、魔法/物理的格挡次数(魔法或者物理伤害的时候,扣除这个数据)、自己本身速度值的控制
      3. BUFF的替换:这个数据相对较小,可以在BUFF添加的时候,自己处理,比如说,引燃。在添加引燃效果时,可以代码检查一下是不是存在引燃,如果存在,直接删掉原来的。添加新的就OK了。
      4. BUFF的相互抵消:同替换就OK,添加的时候,判断是否可以抵消掉自身的BUFF存在就OK,如果存在,则不添加就OK。
      5. 技能消除BUFF:可以根据BUFF的类别(减速、禁锢、重伤、持续伤害等等)或者BUFF ID(对应BUFF名字的ID比如:引燃、莫甘娜的E等等)来消除BUFF
    5. 不同的BUFF是怎么重叠的?
      1. 可以重叠的通过修改自身属性来实现数据上的重叠
      2. 不可以重叠的,在BUFF内部的某个回调、添加BUFF时的检查、或者配表区别来实现兼容性都是可取的。视具体情况而定
    6. BUFF之间存在优先级吗?
      1. 这个是必然的,不过,我觉得很有必要统一一下这个优先级的定义:是指不同的BUFF之间的先后调用(女妖面纱和轮子妈的E同时存在谁先触发?),或者修改部分具体属性的优先级(加速与减速同时存在的时候,先算减速?还是先算加速?算法不统一的话,可能会造成,因为BUFF添加的先后顺序或者储存BUFF状态的顺序而发生的不确定因素。这个是需要尽力避免的)。
      2. 推荐的优先级:容易获得的状态先被触发。加速减速的话。确定下来就好,不过推荐先加后减。
     
    总结:
    1. BUFF系统需要两个列表UI层面列表和状态层面列表
    2. 添加BUFF的时候,需要添加一个UI层面列表和对应的BUFF的状态层面列表,并且将UI层面列表中的数据与BUFF层面列表的状态绑定(当状态被移除的时候需要判定对应的BUFF列表是不是也需要被移除)
    3. 在人物自身中添加对应的相关属性值(女妖面纱、轮子妈的E可以格挡两次魔法伤害,在他们同事存在时,格挡了伤害,需要减少对应人物的格挡值,并且,触发提供格挡效果的BUFF对应回调)
    4. BUFF的回调,主要依靠于注入的方式进行回调
    5. BUFF的替换,可以使用BUFF自身控制或者关系表的方式来进行处理
     
     
    卧槽,写完之后,发现,说的还不是很明白,凑合着看吧。 
  • 相关阅读:
    <<信息学奥赛一本通>> 昆虫养殖 题解
    C++ primer 第七章 练习7.35 类作用域练习
    C++ primer 第六章 练习6.56 函数指针练习
    P1145 约瑟夫
    C++ 查看auto delctype 后变量的类型。(小技巧)
    Educational Codeforces Round 24 题解
    HDU 5279 分治NTT 图的计数
    BZOJ 3473
    BZOJ 3514 LCT+主席树
    看无可看 分治FFT+特征值方程
  • 原文地址:https://www.cnblogs.com/anxin1225/p/4750025.html
Copyright © 2011-2022 走看看