这周不是很忙,因为我们的游戏开发了近一年,由于公司的业务调整,在游戏开第二服的时候,老板果断的把项目停到了。
感觉超级的不爽啊。因为这个游戏项目像我的孩子一样和我一样成长,里边的大概的业务逻辑都是偶实现的,比如
基础系统里的,任务系统,背包系统,公会系统,相关副本系统,商城系统,人物属性相关,运镖,怪物AI,技能相关,地图等等,差不多游戏里的所有业务我都有所涉及
那么对于一个业务是如何设计,如何少的产生bug,和一些漏洞呢。
任务系统
在这里我表述一下,如果是C语言的开发,那么任务系统,属于玩家一个的一个必须要序记住的的数据,因为,我们要在玩家身上找到。
好,那我们就记下来了任务ID,但是我们发现一个游戏系统有很多类型任务,比如
主线任务----主要特征表现在必须做的,不可以放弃的。一般主线任务,同一时刻只允许纯在一种
支线任务----同时可以做很多,同时可以接受很多
循环类型任务-----这个任务可以一天循环做几次。
等等。
因此在设计表的时候涉及到类型,次数也要涉及。还有完成条件,打怪的个数,等等能所有能涉及到的东西。
涉及协议相关的时候,我们要知道任务分为几种状态,可以接,接受状态,运行状态,放弃状态,完成状太。
那么,我们就要涉及到请求接受任务,任务在运行时,随时都可能变化的是刷怪个数,采集否,是否在某个地图等等条件,如果达到了,立即告诉前端,该任务是可以完成了,
如果玩家点击完成,那么我们将送一些奖励给玩家。做一些任务的变化等等。
这里这是大概的说一些基本的东西,很多东西都是需要慢慢的积累下来了。
背包系统
背包系统算是业务系统中比较复杂的了。为什么这么说呢,因为一旦设计不好,那么将会带来效率的问题。
尤其是在道具的堆叠,整理,移动,拆分,交换等等一些操作。
背包也算是玩家的一个重要数据,因此我们会在玩家内存上开辟一段内存。
背包开发当然一定会涉及到道具,那么道具怎么分呢,目前主要我们主要分成道具和装备两大类。
背包的一个个格子,我们就创建一个结构体,这个结构体里是我们使用共用体表示道具和装备。,基本的相同元素,包括全局唯一id,定义id,等,但是装备是具有其他属性的,比如洗练,打造相关。
当我们想加一个道具到背包中,我们就会提供一个接口,来创建一个格子实例,来判断是否能加入,如果判断可以,就直接加入,否则,告诉玩家失败。
设计协议,我们就要有几下,添加道具,道具移动,道具背包移动和背包的道具移动到仓库。消耗背包中道具,具体协议当然是根据需要变化的数据,保持前后端一直。
这里不在赘述。
地图/副本系统
该系统其实也算是游戏业务逻辑的比较复杂的了。
副本其实也是地图,只不过,副本是相对来说人少的,或者说个人的。对服务器压力来说相对比较小,因为对玩家视野,同屏压力较小。
但是我们主世界地图来说是不一样的,所有人都在主世界地图,我要看到其他人,同屏压力就非常大,对与前端也是很大。
那我们是如何设计呢,首先我们要知道二维地图,都是用小格子来表示,一般小格子都是40像素左右的矩形。我们又提出一个冬天区域有包含多少个字,每个格子都可以有那些玩家。
当一个玩家进入到某点,会进行搜索,把相关数据广播出去。同事,该动态区域也会记住玩家ID。其他玩家同事会看到其他玩家。
玩家身上也会记住事业内的道具的内存ID,玩家内存id,怪物内存id.等等。
副本呢,我们会在通过一个地图定义和一个副本定义表来在副本内存池中申请一段内存,那么在该副本的所有数据进行记录。进行一些玩法加载。
公会系统
公会系统唯一要注意的就是如何实现的权限控制。我么你是使用二维数组来进行权限的的控制。其他的就都是在公会内存中操作了,或者在公会的大类里搞来搞去代码了。
怪物AI。
其实怪ai,涉及到东西比较多了。
比如技能,视野。在整个世界里,每个怪物都要tick一遍,因为怪物所有做的东西都是服务器去控制的。玩家去做打怪,怪物就要做一些反应,比如低级怪就要被打,不去攻击玩家,而高级怪可能要去攻击玩家了。
在攻击的时候,根据怪物技能,攻击玩家,然后通过玩家的一些基本攻防的技能来计算伤害值等等。
在业务系统还有很多东西要描述了。在这里不一一赘述了。如果是C++那么就每个都是一个类,然后对这些类操作。
欢迎访问我的博客,跟多文章访问http://blog.csdn.net/wallwind