洛克精灵战记战斗系统实现

发表于2016-01-04
评论3 2.8k浏览

一丶概述

    洛克精灵战记是一款战斗冒险类社区游戏,属于全区全服的页游架构, 其战斗系统类似于刀塔传奇形式的, 战斗由C++实现为核心逻辑库,前端采用flash的alchemy技术转成flash库,驱动前端战斗表现,并在战斗结束后在服务器重算战斗过程并校验作弊。本文主要针对其战斗系统的实现阐述,也是笔者的一种学习总结。

二、后台架构介绍与战斗流程

洛克精灵战记后台架构:

    战斗服务器部署在大区服务器,无状态,支持水平扩容,为缓存落在该大区的玩家服务。反作弊战斗流程如下:

    从上图中可以看到客户端需要进行战斗表现,并且可以接受玩家的输入内容进行正确的战斗逻辑计算。而战斗结束后将对阵信息、玩家的输入内容提交到战斗服务器进行复盘校验。如果校验通过则认可其战斗结果。这里有一个问题, 由于服务器需要做完整的复盘运算,客户端与服务器采用完全不同的语言编写,战斗表现如何才能与服务器的计算结果完全一致?答案将在本文第三部分阐述..

    下图是战斗时序图:

 

        这里可以看到客户端与服务器都存在业务逻辑层, 实际上这是开发运营活动与应用时需要面对的内容,而战斗模块是为其服务的具体战斗核心部分。

 

三、战斗系统框架

    上文中提到为了防止玩家作弊,服务器会对每个单局进行完整的复盘运算,我们遇到两个问题:

    1. 服务器复盘强校验,客户端与服务器采用不同的编程语言,如何保证演算的一致性

    2. 每个战斗逻辑都需要前后台编写,大量重复工作

    我们将战斗核心逻辑和战斗表现进行剥离,战斗核心逻辑使用C++编写以保证性能,服务器与客户端使用同一份代码逻辑以保证双方的计算结果一致,并且也避免了相同逻辑的再次重复实现。使用flash的alchemy技术将战斗核心库编译成flash支持的swc库。

 

3.1. flash, alchemy

    FlasCC 提供了一个完整的类 BSD、基于 GCC 的C/C++开发环境,允许开发者将C/C++代码编译为可在 Flash 平台(Flash Player 和 AIR)上运行的应用程序。通过 alchemy,可以将大部分现有的C/C++代码移植到网络中,并实现跨浏览器,关于alchemy的环境搭建这里不做过多阐述。

    战斗核心中只涉及到逻辑运算,不做任何表现相关的处理。为了让flash客户端进行展现正确的表现展示,我们在每一帧计算中抛出相应的事件,比如技能释放、buff效果、血量变化等。客户端每进行完一帧计算后获取事件列表进行完整的表现。

    典型宠物技能流程涉及的事件列表如下:

/*

* 1.PET_ACTION_CHANGE: ACTION_SKILL,开始起手动画

* 2.(远程或无锁定技能)CREATE_ITEM(1)

* 3.PET_ACTION_CHANGE: ACTION_HURT:命中。播放受击动画(如果是伤害类),技能命中特效

* 4.(技能效果有buff)ADD_BUFF, (技能效果修改数值)PET_ATTR_CHANGE

* 5.PET_ACTION_CHANGE:IDLE,技能动作完成

*/

   移动流程涉及的事件列表如下:

* 1.PET_ACTION_CHANGEACTION_WALK,开始移动

* 2.PET_ATTR_CHANGE: MOVE_SP,通知移动速度

* 3.PET_ACTION_CHANGE:IDLE,停止移动

3.2.技能与buff系统

    

    战斗系统的组成部分是技能与buff系统, 其处理流程如上图所示。 为了快速验证与修改技能,我们制作了技能编辑器,编辑器链接和游戏相同的战斗核心库, 使用编辑器进行战斗模拟以反复修正数值和战斗逻辑,编辑器导出相应的技能数据提供给游戏前后台运行时使用。

四、结语

    精灵战记的战斗系统是一种典型的卡牌类战斗,将战斗核心的逻辑与表现分离,使用 alchemy使得同样的战斗逻辑能被同时用于客户端与服务器以及技能编辑器,解决了前后台运算的一致性问题,同时也避免了重复的代码编写工作。

 

 

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引