前言

  转载请标明出处http://www.cnblogs.com/zblade/

  很久没有更新博客,中间迁移过一次博客,后来一直忙于项目的开发,忙的晚上回去没时间写博客,周日又要自我调整一下,所以空闲了很久没有继续写博客。最近终于慢慢放慢节奏,项目也快上线了,可以有空写一些个人的笔记。准备写一个战斗系统的入门笔记,也算一个自我总结和反思的过程,中间有些地方是个人的一些想法和理解,如果有什么不正确的,欢迎大家留言讨论。

  通常,我们在玩一款游戏的时候,最直接面对的玩法,就是这款游戏的战斗系统。由于游戏的分类实在太多,对应的战斗玩法也各有其特色。而我目前参与研发的游戏,主要是RTS游戏和MMORPG游戏两种类型,所以我的随笔就记录一下MMORPG游戏的战斗系统的一下设计笔记。

2016年属于MMORPG爆发的一年,多款MMO手游均取得不错的运营业绩,2017,依然属于主流的手游研发类型。在MMORPG游戏中,目前主流的战斗系统可以分为2类:回合制战斗和即时制战斗。回合制游戏的代表,《梦幻西游》,堪称经典,网易对于这款端游转手游的游戏也是用心研发和运营。即时制战斗的代表,《剑侠》,《齐天大圣》,资料片流出的《剑网三手游》等,都有不错的即时制战斗体验。

  虽然很多人对于MMO游戏的理解,主要在系统玩法和社交体验上,大部分玩家进游戏后的战斗都是开启自动挂机的战斗,相对于MOBA游戏,不注重战斗体验。不过剥离出游戏的类型,整个游戏的战斗系统其实属于一个相对独立的模块,而且是整个游戏的核心部分,所以掌握理解了战斗系统,对于大部分的游戏可以有一个相对深入的理解。本文就从一个小白的角度去理解隐藏在背后的即时制战斗系统是如何执行的。

  战斗系统的组成

从小白的角度理解,战斗系统,可以分为:按键响应,技能获取,寻敌检测,技能释放,伤害计算,战斗表现,总共6个大的部分,下面我逐个分析其中的一些执行逻辑。

一、按键响应

  在进入游戏后,在游戏的界面上,可以看到一个左侧的摇杆,右侧都会有一个当前职业的技能控制按钮。这在MMORPG和MOBA游戏中,属于比较常见的设计。我们在操作游戏角色进行战斗的时候,可以点击右侧的技能按钮,从而释放技能进行战斗。从技能按钮点击,到执行战斗,第一步就是按钮响应。

在玩家进入游戏后,就会在游戏模块中打开当前角色对应的技能界面,同时对玩家的点击按钮添加一个事件监听。如果你对事件监听不是很了解,直白的说,就是A添加一个attention,该attention是关注B是否发生,当B发生的时候,B广播其发生,这时候A接收到B发生了,则执行B发生时A应该执行的一些操作。这样的一个直白解释,就是常见的监听系统的设计过程。这样当玩家点击技能按钮X的时候,技能界面会读取其对应的技能指代,然后将其广播出去。在前面监听的部分,在收到该事件后,就会执行技能获取操作,从而传递到后面的部分。

二、技能获取

  现在执行到第二步,这时候已经知道玩家点击了某个对应的技能,但是具体是什么技能,还需要进行一系列的操作才能获取到。首先,游戏中,会有不同的职业,不同的职业会有不同的技能配置。所以首先是需要找到当前职业对应的技能。怎么获取呢?在MMORPG游戏中,对于不同的职业,会开发对应的技能组件SkillCpnt。在每个职业角色的实例上,挂载一个技能释放器SkillCaster。这个技能释放器SkillCaster,就是用来执行技能的读取和释放的主要角色。那么它在响应技能按钮点击后,会获取当前玩家具体的技能组件SkillCpnt, 在当前技能组件SkillCpnt中,获取当前技能对应的技能配置。通常,一个技能按钮,会对应的配置一个或者多个技能,这时候需要检测技能的对应释放顺序,同时需要检测当前技能的CD和消耗等。在获取到可以释放的技能后,接下来就需要进行技能的释放了。技能释放的第一步,就是寻找攻击目标。

三、寻敌检测

  在读取到技能后,接下来就是要找到可以攻击的目标。首先,会获取当前技能范围内的所有目标,然后进行检测。首先,检测其是否有效,然后检测是否属于当前技能攻击的类型(比如有的技能打人,有的技能打建筑),然后判断是否是敌人类型(不同玩法对于敌人类型的判断不一致,需要具体设计),是否在攻击范围内,在这个检测中,通常策划会进行一系列规则扩展,最后得到是一个繁琐的检测过程。对于这样的扩展,程序只能尽量保证扩展性和鲁棒性,同时对于某些特定的检测,尽量写入特定的玩法,避免影响公共检测的性能。

  在这儿,需要补充一下,对于游戏中的角色,主要分为两类:玩家和怪物。所以,对于这两类角色的技能检测,可以分为两种不同的方式进行检测的,这样可以尽量保证各自的规则设计,避免耦合和繁琐。

四、技能释放

  相对于前面三步操作,技能释放的流程就比较简单,在完成寻敌检测后,此时已经知道当前主角要用什么技能,对着什么目标进行释放了,所以通过技能释放协议,将相关的信息传递到服务器,服务器会收到当前释放技能的请求,然后进行技能校验,主要是检验技能是否处于CD,技能消耗是否足够,攻击对象是否有效等检测,如果通过,则下发给客户端做技能表现。同乘为了提高用户体验,在本地玩家自身的客户端,其释放的技能,是先做技能释放,同时传递给服务器技能释放的请求,如果通过则直接继续,如果不通过,则打断播出的技能动作。这样的设计流程,是为了避免在网络不好时,技能响应过程太慢,玩家点击时没有及时的响应,用户体验太差。

五、伤害计算

  伤害计算的过程,属于偏向数学计算的过程,如果从小白的角度理解,其基本的流程可以分为:技能更新,伤害寻敌,伤害计算,伤害结果这4个步骤。首先是技能更新,在打出当前技能后,并不是立即生效的,在配合着动画和特效,会有一个更新时间间隔,当更新完后,就会进行伤害检测(通常这个过程称为子物体更新的过程)。完成子物体的更新后,接着就是伤害计算,首先需要根据规则找到当前子物体周围配置范围内的物体,做一次寻敌检测。这个检测的过程,其实就是我们常见的技能特效模型检测,比如直线检测,圆弧检测,圆形检测,矩形检测,这四种基本最常见的检测。通过这四种对应的检测可以获得一个可以攻击的目标对象列表,然后逐个计算其对应的伤害。具体的伤害计算,需要根据数值的伤害计算公式,读取攻击者和被攻击者的相关属性完成对应的伤害值计算。在得到一个伤害结果后,就会进行扣血的操作,然后下发相应的数据结果给客户端。

六、战斗表现

  最后的战斗表现,是一个归纳的过程,包括技能释放角色的战斗动作和特效,被攻击者的战斗动作和特效,已经相应的UI数据展示等。这样的战斗表现,都可以用对应的技能控制器来实现,特定的技能控制器,在设置后会进行自更新,然后触发对应的动作播放,在动作播放中会触发播放对应的特效。基于这样的基本设计,就可以实现整个战斗的动作和特效播放。

  写到这儿,我又要再现我的灵魂画法了,将整个过程归纳为一个草图,哈哈:

  

  好了,对于整个战斗流程,从小白的角度做了一个大概的讲解,后续我会接着做一些战斗系统相关的文章分析,比如寻路,行为树,AI,组件设计等,下篇文章见~

MMORPG战斗系统随笔(一)、战斗系统流程简介的更多相关文章

  1. gitlab工作流程简介

    gitlab工作流程简介 新建项目流程 创建/导入项目 可以选择导入github.bitbucket项目,也可以新建空白项目,还可以从SVN导入项目 建议选择private等级 初始化项目 1.本地克 ...

  2. HTTP请求流程(一)----流程简介

    最近一直在研究如何让asp.net实现上传大文件的功能,所以都没怎么写技术类的文章了.可惜的是至今还没研究出来,惭愧~~~.不过因为这样,也了解了一下http消息请求的大致过程.我就先简单介绍下,然后 ...

  3. [转】:HTTP请求流程(一)----流程简介

    http://www.cnblogs.com/stg609/archive/2008/07/06/1236966.html HTTP请求流程(一)----流程简介 最近一直在研究如何让asp.net实 ...

  4. FFmpeg编解码处理1-转码全流程简介

    本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10584901.html FFmpeg编解码处理系列笔记: [0]. FFmpeg时间戳详 ...

  5. MMORPG战斗系统随笔(三)、AI系统简介

    在设计一款游戏的时候,如果我们是玩家,是希望自己能够操作角色畅玩游戏的.在一款MMORPG游戏中,大部分的实际游戏角色,是需要玩家来操作的,通过在游戏大世界相互完成游戏中的任务等等来体验游戏.在大世界 ...

  6. MMORPG战斗系统随笔(一)

    前言 很久没有更新博客,中间迁移过一次博客,后来一直忙于项目的开发,忙的晚上回去没时间写博客,周日又要自我调整一下,所以空闲了很久没有继续写博客.最近终于慢慢放慢节奏,项目也快上线了,可以有空写一些个 ...

  7. MMORPG战斗系统随笔(二)、浅谈场寻路Flow Field PathFinding算法

    转载请标明出处http://www.cnblogs.com/zblade/ 今天给大家带来一篇游戏中寻路算法的博客.去年,我加入一款RTS的游戏项目,负责开发其中的战斗系统,战斗系统的相关知识,属于游 ...

  8. MMORPG战斗系统随笔(四)、优化客户端游戏性能

    转载请标明出处http://www.cnblogs.com/zblade/ 说到游戏性能,这是一个永恒的话题.在游戏开发的过程中,性能问题一直是我们研发需要关注的一个节点.当然,说句客观话,很多程序员 ...

  9. 【Android 系统开发】 Android 系统启动流程简介

    作者 : 万境绝尘 (octopus_truth@163.com) 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/3889548 ...

随机推荐

  1. python编程之如何在Windows上安装python

    一.安装python 首先检查你的系统里是否安装了python,开始菜单里点击运行输入cmd打开一个命令窗口,或键盘快捷键windows+R打开,在窗口中输入python并回车,如果出现了Python ...

  2. Django之发送邮件

    Django的发送邮件是基于django的一个组件进行操作的,EmailMessage 基本使用方法: def send_html_mail(subject, html_content, from_a ...

  3. 查看进程被哪台电脑的哪个进程连接(netstat)

    1.netstat -ano|findstr 进程号,找出连接该进程A所有的ip(可以看到该进程的端口号和连接进程的端口号): 2.到连接该进程的电脑上,打开cmd命令行,输入netstat -ano ...

  4. 关于PHP读取HTTP头的部分

    本文转载自https://my.oschina.net/luoczi/blog/86608 1.关于PHP读取HTTP头的方法 $_SERVER['PHP_SELF'] #当前正在执行脚本的文件名,与 ...

  5. shell脚本学习-文件包含

    跟着RUNOOB网站的教程学习的笔记 和其他语言一样,shell也可以包含外部脚本.这样可以很方便的封装一些公用的代码作为一个独立的文件.shell文件包含的语法有两种形式 . filename  # ...

  6. 团队-Forward团队-团队一阶段互评

    团队名称:Forward团队 学号:2015035107105 得分:7 原因:知识欠缺,能够一边学一边做 学号:2015035107109 得分:6 原因:对我有很多帮助 学号:2015035107 ...

  7. Py福利,基于uiautomatorviewer 的Python 自动化代码自动生成工具分享(jar已发布GitHub,欢迎Star)

    前言做UI自动化无论你用SDK自带的uiautomatorviewer还是Macaca还是Appium自动的inspector,代码最多的就是那些繁琐重复的找元素后点击,输入,长按.....等.现在偷 ...

  8. 机器学习常用sklearn库

    Sklearn.model_selection(模型选择) Cross_val_score:交叉验证 Train_test_split:数据切割 GridsearchCV:网格搜索 Sklearn.m ...

  9. stm32模拟IO读写AT24C02

    /* *@brief 主机向从机写多字节 * *@param addr - 地址 *@param p_buf - 数据指针 *@param len - 待写入字节长度 * *@return * *@n ...

  10. java 判断用户是PC端和还是APP端登陆

    java 判断用户是PC端和还是APP端登陆 public void getRequestHeader(HttpServletRequest request){ // 从浏览器获取请求头信息 Stri ...