转自 http://blog.csdn.net/cyblueboy83/article/details/41628743

一、前言

基本所有MMO游戏无论是回合制、策略类、即时战斗等等类型都需要有相应的技能系统,所以技能系统有一定的通用性和可复用性,但每种类型的游戏也会有自己的特点,不过万变不离其宗,本文结合自己参与开发并在公网运营两年以上的两款游戏,分别为一款SLG策略游戏和一款即时战斗类游戏,阐述下技能系统的实现方法,方法并不是最优的,但已经实现并经过外网运营几年时间的检验,相信会有一定的参考性。重点讲述即时战斗类的技能实现方法,因为即时战斗类的技能实现相对来说更加复杂和需要考虑的地方更多

二、技能基础数据定义

2.1技能分类

技能系统都会有多样性,如果都是一样类型的技能那可玩性必然太低,大体上分类包括、1、立即触发类 2、火球、飞弹类(需要经过一定的飞行距离:火球术、冰箭术)3、触发相应的状态(如:战吼,施放后增加自身的攻击力) 4、回城类 5、骑乘类 6、捕捉宠物 7、采集类等生活技能 8、复活类 9、飞行类(施放成功后传送到指定的地点或者召唤某人到自己身边)等等,其中根据游戏类型有些技能可以合并和再细分,目前先以这个做为讨论

2.2技能基本属性定义

技能虽然需要划分为不同的种类,但同时基本会有一些通用的属性,尽量提取更多的属性进行基础熟悉的定义,例如做技能基础表格的定义。

(1)所属职业(战士、法师)

(2)技能自我否定类型(魔法是否足够、是否冷却中、是否被沉默、是否被致盲….)

(3)技能目标否定类型(施法距离是否合法、宠物否决、公会成员否决、BOSS否决)

(3)关系过滤(0对所有关系都有效,1只对夫妻有效2只对队友有效果…)

(4)技能施放目标(1自己2宠物技能跳向主人3夫妻传送等)

(5)技能种类

(6)打断方式:0移动,1死亡,2普通攻击,3技能攻击,4被攻击,5使用物品

(7)移动锁定

(8)技能主被动类型(0主动攻击技能,1主动辅助(加BUFFER)2攻击时触发的技能3被击时触发的技能4被动辅助5替宠物施放技能)

2.3技能等级属性

技能一般都会有不断学习进化的过程,所以需要定义技能等级学习需要消耗的资源,以及每一等级技能提升的效果

(1)冷却时间

(2)吟唱时间

(3)触发机率

(4)结算公式(下面再详细说明)

三、角色技能施放管理

定义好技能的种类和基础属性以及等级属性之后,自然需要实现技能的施放和施放后带来的各种状态的管理,例如buffer和Debuffer等等的变化

3.1技能施放基础类

定义技能施放基础的属性和方法

基础方法:开始施放,施放过程每次循环触发,施放完成,被打断

基础属性:打断方式、延迟时间,基础属性通过上面的读表获取

所有技能可以承该类进行特化,定义技能特有的逻辑

例如

复活技能:CSkill_Relive:public cSkillBase

施放前触发DoStart()通知目标玩家是否同意被复活;DoFinish复活目标玩家

飞行技能:class CSkill_FlytoOther : public cSkillBase

施放前触发DoStart()检查目标玩家和施放源是否存在;DoFinish根据目标玩家的位置,      传送到目标玩家身边

技能施放流程:

3.2技能状态

基础状态类:状态属性定义

  1. 最大个数

  2. 状态效果(不能移动1,禁魔不能施法2,隐身3,不能攻击4,无敌5,GM无敌6强行攻击状态的释放者7,变身状态8,次数盾9,伤害盾10,附加伤害11,附加被伤12,13魔法盾,14完全闪避)

  3. 是否允许打断

  4. 是否需要保存

  5. 打断方式

  6. 效果类型(一般技能0,DOTHOT状态1,控制状态2,经验4,挂机BUFF5,骑乘BUFF6,变身BUFF7,回血8,回魔9,无敌10,嘲讽11,盾12,法器BUFF13,沉默14;怪物一般技能20,DOTHOT状态21,控制状态22,经验24,挂机BUFF25,骑乘BUFF26,变身BUFF27,回血28,回魔29,无敌30,嘲讽31,盾32,沉默34,隐身35,公会技能)

  7. 持续时间

  8. 持续次数

  9. 间隔时间

  10. 结算方式(0下标结算,1公式结算,2间隔释放技能)

  11. 属性变化:(状态改变人物的属性)

    状态管理(定时轮循)

    定时刷新人物身上的状态,根据状态的间隔时间计算触发每次状态的结算,并且根据结算的类型进行相应的计算:每次触发EachTime例如(目标玩家踩到了陷阱则中了陷阱状态,每隔5秒钟扣取5%的血量),状态结束触发DoFinish

3.3技能施放

有了技能的施放和状态属性之后,可以进行技能的施放。

DoSkill基本的检查(例如:职业匹配、读者技能表格基础属性、寻找范围内目标、触发打断其他技能)

检查通过后,加入技能施放管理状态(根据DoSkill搜寻的目标设置状态的目标群、设置状态的表格数据、持续次数等)

之后由3.2的状态管理器定时进行状态的结算

四、技能结算

一般结算公式是数值策划发挥的地方,技能数值是否平衡,关系到整个游戏的可玩性,

使用Xml格式,打造技能公式编辑器,然后为了效率,生成cpp代码,这样可以有编辑性的同时也不牺牲效率

例如战士冲锋结算公式:分别代表

扣取技能释放者指定的魔法值

增加技能释放者xp(大招的能量值)

增加技能承受者xp

【转】MMO即时战斗:技能实现的更多相关文章

  1. [转] MMO即时战斗:地图角色同步管理和防作弊实现

    一.前言 无论是端游.页游.手游如果是采用了MMO即时战斗游戏模式,基本都会遇到同屏多角色实时移动.释放技能.战斗等场景,于是自然也需要实现如何管理同屏内各种角色的信息同步:例如角色的位置.以及角色身 ...

  2. 【转】MMO即时战斗:地图角色同步管理和防作弊实现

    ---转自CSDN 一.前言 无论是端游.页游.手游如果是采用了MMO即时战斗游戏模式,基本都会遇到同屏多角色实时移动.释放技能.战斗等场景,于是自然也需要实现如何管理同屏内各种角色的信息同步:例如角 ...

  3. MMO技能系统的同步机制分析

    转自:http://www.gameres.com/729629.html 此篇文章基于之前文章介绍的技能系统,主要介绍了如何实现MMO中的技能系统的同步.阅读此文章之前,推荐首先阅读前一篇文章:一个 ...

  4. 如何平衡MMO游戏

    转自:http://blog.sina.com.cn/s/blog_9f56a65f01013eti.html 前言 这是一篇出自国外博客“Elder Game”的一篇文章,笔者觉得里面很多东西说的很 ...

  5. 知道创宇研发技能表v3.1

    by @知道创宇(www.knownsec.com) @余弦 & 404团队 后续动态请关注微信公众号:Lazy-Thought 说明 关于知道创宇 知行合一 | 守正出奇 知道创宇是一家黑客 ...

  6. Android高工必备技能

    转载:http://www.jianshu.com/p/d791bbede02c Step 1. 玩转RxJava 使用RxJava处理异步极其方便,各种操作符可以对数据做流水线式操作,再加上与Ret ...

  7. iOS 即时通讯SDK的集成,快速搭建自己的聊天系统

    现在的外包项目需求变态的各种各样,今天要做社交,明天要加电商,后天又要加直播了,这些系统如果要自己开发,除非大公司技术和人力都够,不然短时间是几乎实现不了的.所以学会灵活利用市面上的各种SDK是灰常重 ...

  8. ARPG游戏技能系统设计

    ARPG游戏的技能的前端表现, 主要指的是人物动作和特效表现, 从普遍意义上讲,大致可以分为三个阶段:起手.飞行.碰撞(爆炸). [特效可见性判断] 1.[attacker & victim] ...

  9. 知道创宇研发技能表v3.0

    知道创宇研发技能表v3.0 2015/8/21 发布 by @知道创宇(www.knownsec.com) @余弦 & 404团队 后续动态请关注微信公众号:Lazy-Thought 说明 关 ...

随机推荐

  1. java eclipse 访问 Oracle数据库的代码

    package com.hanqi.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.R ...

  2. STM32之定时器输入捕获

    1.输入捕获模式可以用来测量脉冲宽度或者测量频率.STM32的定时器,除了TIM6和TIM7,其他定时器都有输入捕获功能.STM32的输入捕获,简单的说就是通过检测TIMx_CHx上的边沿信号,在边沿 ...

  3. 大数据框架-YARN

    YARN(Yet Another Resource Negotiator): 是一种新的 Hadoop 资源管理器 [ResourceManager:纯粹的调度器,基于应用程序对资源的需求进行调度的, ...

  4. 系统优化怎么做-Tomcat优化

    大家好,这里是「聊聊系统优化 」,并在下列地址同步更新 博客园:http://www.cnblogs.com/changsong/ 知乎专栏:https://zhuanlan.zhihu.com/yo ...

  5. php 当不确定用户输入的是浮点 还是整数 还是字符串时

    $price = (floatval($price))?intval(floatval($price)*100)/100:0;

  6. PHP中级程序员常见面试题

    1).写一个函数,从一个标准url里取出文件的扩展名,需要取出php或.php <?php $a="http://www.test.com.cn:88/abc/de/fg.php?id ...

  7. centos7中nginx的搭建

    ./nginx 启动服务./nginx -s stop 关闭服务./nginx -s reload 重新加载配置文件 首先我们应当安装一个依赖的软件包: yum install gcc-c++yum ...

  8. hadoop生态搭建(3节点)-12.rabbitmq配置

    # 安装 需要相关包# ==================================================================node1 node2 node3 yum ...

  9. java中有关Volatile的几个小题

    1.java中能创建volatile数组吗? 能,java中可以创建volatile数组,不过只是一个指向数组的引用,而不是整个数组,如果改变引用指向的数组,将会受到volatile的保护,但是如果多 ...

  10. 第五节 Go数据结构之队列

    一.什么是队列 数据结构里的队列就是模仿现实中的排队.如上图中狗狗排队上厕所,新来的狗狗排到队伍最后,最前面的狗狗撒完尿走开,后面的跟上.可以看出队列有两个特点: (1) 新来的都排在队尾: (2) ...