在网络游戏中的战斗形式多种多样,不同游戏的战斗逻辑也有很大的差异。但是一般都会涉及技能系统和buff系统,两种之间相互关联,技能可以产生buff作用在目标上,影响目标。同时buff也会影响技能的释放效果,两者都可以算得上游戏战斗系统最重要的元素。

在游戏战斗中有许多各种各样复杂的buff和技能,这些buff和技能是由基础的buff和技能效果机制组合形成的。通过基础的机制效果的组合,形成各种各样的复杂的buff和技能。这些基础的buff效果机制和技能效果机制支持策划通过配置表配置数据,来影响这些buff和技能的实际效果。

不同类型的游戏的战斗可能多种多样,但是只要把握核心要素,相同buff系统和技能系统可以适应不同类型的游戏。

下面介绍我对于buff系统的理解,算是抛砖引玉吧。

buff的来源可能是战斗单元释放的技能,可能是buff效果产生新的buff,可能是战斗一开始因为佩戴某件装备。

buff产生的效果各种各样例如,增加\降低属性值,一定时间内流失/恢复生命、魔法等,眩晕,沉默,护盾,嘲讽,反伤,攻击时攻击增伤、受击时减伤,死亡时造成对手造成伤,击杀目标时回血等等。同一个战斗单元可以有多个buff。

为了增加buff系统的可用性和灵活性,我们可以把一个buff拆分成一到多个基础的buff效果,通过实现基础的buff效果,灵活组合形成多种多样的buff。例如给英雄施加一个buff效果是护盾同时在buff移除时恢复英雄10%的血量,这一个buff就有两个基础效果,一个是护盾,另一个是buff移除时回复血量,一个buff可以有一到多个buff效果,而一个英雄有多个buff。

为了管理战斗单元存在的诸多buff,需要一个buff管理器管理buff的添加、生效、移除等整个生命周期,供外部使用的接口也只能是buffManger,比如添加buff,发送buff列表,检查buff效果状态,在触发点调用来执行buff效果等等。buff基础效果、buff、buff管理器关系如下:

具体实现需要设计一个buff效果的基类,其中成员变量有buff效果编号以及buff效果实现的虚函数。所有buff机制效果需要继承基类,根据具体buff效果实现void perform(unsigned char buffStep)函数,每一个buff效果编号,用于区分所属buff效果,这样便于buff管理包含的buff效果。

struct basePerform
{eBuffPerfrom perfromType;//可以定义一个枚举
Buff* owner;                //所属buffbasePerform(eBuffPerfrom _perfromType, Buff* _owner):perfromType(_perfromType),owner(_owner){}
virtual void perform(unsigned char buffStep)=0;//buff效果具体执行virtual ~basePerform(){}
};

buff管理着一到多个继承自basePerform的子类对象。效果编号决定执行那个buff基础效果。buff中还有记录着释放buff者战斗单元的指针、buffManger的指针、buff叠加层数、buff配置数据,buff生成时间、buff类型、buff移除标志等数据。

class Buff
{
public:Buff(FightUnit* _attacker,buffManger* _manger,  const cBuffCfg* _cfg, eBuffType _buffType, DWORD _putTime);virtual ~Buff();
//一些函数实现,诸如buff效果的实现,buff初始化,标记移除等等
public:FightUnit* attacker;     //产生buff的FightUnit
buffManger* _manger;const cBuffCfg* _cfg;      // buff配置表数据unsigned long putTime;    //buff的产生时间unsigned short overlay;   //叠加层数eBuffType buffType;         //buff类型bool bRemove;           //移除标记
unsigned char buffStep;     //buff执行步骤std::vector<basePerform*> vecBuffPerform;//buff的所有效果
}

buffManger保存这一组buff,buffManger所属的战斗单元等数据。控制着buff的整个生命周期

class buffManger
{
public:buffManger(FightUnit* _owner);virtual ~buffManger();
//一些函数实现,比如添加/移除buff函数,timetick函数,buff触发函数,检查buff效果函数等等
privet:FightUnit* owner;std::vector<Buff*> vecBuffs;
unsigned short buffPerformStatus[eBuffPerfrom_Max];
}

buff效果多种多样,buff效果可能是某种状态,比如眩晕,在战斗单元行动或释放技能时,检查战斗单元的buffManger遍历所有的vecBuffs下所有buff的buff效果是否有眩晕效果,如果有不能行动或者释放技能。也可能是加属性值的,添加或者移除buff时根据buff效果重新计算战斗单元的属性值。或者是触发式,比如流失对于回合制的便可能是每回合造成减血,对于非回合制的可能是每秒造成减血。触发有很多点会导致触发,比如死亡时,攻击时,受击时,暴击时,格挡时等等,这样每次到触发点,要遍历所有buff的所以机制找到符合条件的执行buff效果。

为了减少遍历次数,可以在buffManger中添加buffPerformStatus数组变量,模仿只能指针做一个计数。每一个成员代表这个buffManger的buff效果的计数,如果没有相应的buff效果计数值为零,添加buff时如果有相应的buff效果,计数加一,buff移除相应buff效果也移除,计数减一。这样我们在检查某种buff状态,比如眩晕,就不需要遍历说有的buff了。触发时如果有相应的buff效果再去遍历。

这样这个buff系统模型可以适合大部分战斗,稍微改改不同的战斗都可以使用。

网络游戏战斗系统之buff系统具体设计实现相关推荐

  1. Buff系统框架设计

    Buff的配置文件 BufType: 1: 精神类Buf 2: 物理类Buf 3.元素类Buf 4.其他类Buf 5.被动类Buf BufSubType: 1000-1999 精神子类 2000-29 ...

  2. buff系统 游戏中_游戏策划如何设计一个好用的BUFF系统!

    之前一篇文章,介绍了以下是游戏系统中技能设计需要考虑的一些问题,如果你还没看过,那么就请移步阅读<游戏中的技能是如何而来的?> 在这篇文章中也提到了,技能中一个很重要的组成部分就是BUFF ...

  3. buff系统 游戏中_游戏中的技能如何而来? 为ARPG设计一个好用的BUFF系统

    游戏中有宏大的场景地图,丰富的游戏剧情,逼真的人物角色.但要让角色(职业)炫酷起来,还是要靠各个职业的技能来烘托.技能系统,根据游戏类型不同而会有不同,ARPG.回合类RPG.SLG类各个游戏都有技能 ...

  4. 游戏中的技能如何而来? 为ARPG设计一个好用的BUFF系统

    转自:游戏中的技能如何而来? 为ARPG设计一个好用的BUFF系统 - GameRes游资网 游戏中有宏大的场景地图,丰富的游戏剧情,逼真的人物角色.但要让角色(职业)炫酷起来,还是要靠各个职业的技能 ...

  5. python游戏开发引擎_基于Python的网络游戏脚本系统的设计与实现

    基于 Python 的网络游戏脚本系统的设计与实现 摘要:传统的网络游戏开发采用 c/c++ 实现游戏的逻辑功能,随 着游戏内容越来越丰富以及快速变化的市场需要, c/c ++ 已经不能 满足开发者对 ...

  6. [Unity] ACT 战斗系统学习 2:从 Buff 系统开始的思考

    从零开始写,我希望 Buff 系统由三部分组成 BuffSystemSingleton 用于存 Buff 对象池和 Buff 字典,提供创建 Buff,回收 Buff 的功能 BuffManager ...

  7. 成长系统的设计方法:如何“挖坑”,又不让玩家反感

    原文地址:http://bbs.gameres.com/thread_330212.html 游戏类型:  设计类型:[系统/框架/思路/玩法] 成长系统的设计方法 目录 成长系统的设计方法..... ...

  8. java-net-php-python-java作业批改系统的设计PPT计算机毕业设计程序

    java-net-php-python-java作业批改系统的设计PPT计算机毕业设计程序 java-net-php-python-java作业批改系统的设计PPT计算机毕业设计程序 本源码技术栈: ...

  9. 简单的技能Buff系统

    在本教程中,我将向您展示如何使用可脚本化对象为Unity创建灵活的buff系统.我们将使用可编写脚本的对象作为快速创建和管理buff的方法,而不必使用外部数据类型(如xml或txt文件).这可以让我们 ...

最新文章

  1. bootstrap项目实例_精选开源SpringBoot项目:涵盖权限、搜索、秒杀、支付!值得学习...
  2. 坚持早起21天,每月躺赚5000元!
  3. 一篇文章带初学者明白:什么是编译器,什么是集成开发环境(IDE)?
  4. MyBatis实现模糊查询的三种方式
  5. Exchange Server 2007邮箱服务器失败规划和恢复
  6. ensp配置access口_eNSP初学者配置以太网2种链路端口:access、trunk
  7. unity透明物体显示问题
  8. c语言windows窗口程序,C语言编写windows窗口程序
  9. taobao.trades.sold.get-查询卖家已卖出的交易数据API接口,店铺交易API接口,店铺订单交易API接口,订单详情API接口,r2接口,淘宝oAuth2.0接口
  10. SourceInight快捷键(英文版)
  11. UG自定义工程图模板(一)
  12. Oracle:ORA-00054 资源正忙 -- 锁表的解决方法
  13. mysql实战45讲--- 22 mysql有那些”饮鸩止渴”提高性能的方法?
  14. Linux的markdown笔记软件,Markdown工具满天飞,哪一款适合用印象笔记的你?
  15. 企业公众号文章写作方向要从这几个方面着手
  16. 关于wav amr音频分析
  17. 用计算机算cos1,cos1等于多少怎么算
  18. IT人员求职招聘网站
  19. 通过java遍历文件夹的文件并通过条件筛选
  20. 35道最新【软件测试】面试题,常见面试题及答案汇总

热门文章

  1. Contest1065 - 第四届“图灵杯”NEUQ-ACM程序设计竞赛(个人赛)E粉丝与分割平面...
  2. 轻应用秘密武器之端能力
  3. 计算机应用基础综合检测卷b,计算机应用基础试卷B
  4. 如何解决eps常用编码工具条缺失
  5. 《操作系统真象还原》读书笔记 第3章
  6. python 下棋_Python开发象棋小游戏(总体思路分析)
  7. LINUX驱动Makefile模板
  8. SpringBoot重点详解--使用Junit进行单元测试
  9. 你专属的斗图聊天神器——aidou for mac
  10. 薪酬方案须及时更新[转]