花滑闫涵:再议MMORPG中技能系统设计 - fit_liam的专栏 - CSDN博客

来源:百度文库 编辑:九乡新闻网 时间:2024/07/14 02:19:57
再议MMORPG中技能系统设计 收藏
好久都没有更新文章了,一个比较忙,再加上犯懒。。刚好前一段设计了一下技能系统,相信每一个人做有每一个人做的方式,这里把自己设计的一些心得拿出来分享一下。首先是如何来划分模块,我这里把整个技能逻辑过程分为三部分:1. 产生技能2. 产生impact3. 产生effect解释一下吧,首先技能本身部分,这里主要是指技能释放逻辑,这部分逻辑是比较固定的,比如,消耗需求,目标需求,状态需求,互斥需求,时间需求,子技能等等我们使用表格化的数据来表示这部分内容其次impact部分,每一个技能可以产生多个impact,每个impact是一个产生最终结果的独立体,它同样有比较固定的逻辑,比如说时间,触发逻辑,产生effect逻辑,每一个impact又会产生多个effect最后就是effect,其实结果集合,这个结果集合在我看来是一个大而全的,因为我们要尽可能的支持以后的扩展,那么就需要它尽可能全面这个可能有人觉得会很复杂,其实不然,我们可以大致总结为,影响属性,影响状态,特殊逻辑事件,如果状态可以表示为玩家属性,那么就是影响属性与特殊逻辑事件这么简单,因为特殊逻辑事件是特例,并且很少量,我们可以单独做,比如说召唤宠物技能。。那么影响玩家属性呢?我这里是这么分类的,按照需要不需要客户端效果表现,比如说有不少游戏都有头顶冒伤害字之类的,那么我们需要把这部分东西提出来做一个单独的处理函数。那么effect到底在程序里是一个什么东西呢?就是处理函数+属性枚举属性枚举表现出来将是这么一个东西: EFFECT_POINT_PHYSICSHURT,         //物理伤害点 EFFECT_PERCENT_PHYSICSHURT,    //物理伤害百分比 EFFECT_POINT_HPRECOVER,           //hp回复点 EFFECT_POINT_PHYSICSATTACK,     //物理攻击点 ............ EFFECT_NUMBER,我们的大概有600多条,大部分是不需要立即刷新的(这里要看表现需求)那么这些不需要立即刷新的我们做哪里呢?就是:周期刷新那么我们的计算公式可能像下面这样子:INT GetPhysicAttack(){      (对象裸体物理攻击点+装备增加物理攻击点+技能增加物理攻击点)*(1+(装备增加物理攻击百分比+技能增加物理攻击百分比))}是不是事情变得简单了我们把大部分effect做成了这样一个东西struct _EFFECT_{     INT m_EffectType;     INT m_EffectValue;}那么比如说技能可能附着在对象身上那么对象身上只需要挂一个:_EFFECT_    m_SkillEffect[EFFECT_NUMBER];比如说玩家身上挂了两个增加物理攻击点的impact, 那么他们的值就是A+B的关系,那么impact消失或移除也简单了就是A+B - A或B的关系,当然可能有人说了这里会有衰减什么的。没有关系就按衰减规则进行加或减,只要impact存在我们一定能找到的这里总结一下:首先为什么这么设计,这是因为技能及impact逻辑是比较固定,既然是比较固定的东西我们就应该固定下来,再者,要支持丰富的内容,那么不外乎特殊逻辑 + 基于现有属性系统的应用。因为不可能会超出现有属性系统的,因为所有内容是要基于现有属性系统运算这里就说一下特殊逻辑,比如反馈,对目标输出效果A,得出参数y, 同时以y为参数对自己输出效果B,类似的要做特例了,hoho,幸运的是这些只占5%左右
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/fit_liam/archive/2010/08/03/5785068.aspx