6

ouster开发笔记第三周

 3 years ago
source link: https://www.zenlife.tk/ouster-dev3.md
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

ouster开发笔记第三周

2014-04-21

这周回家了,回家,办宽带,报驾校,考科目一杂事做了好多,实际的有效工作时间居然也就两天的样子。好的一方面是开始慢慢进入状态了。之前一边写客户端一边写服务端,感觉效率太低了一点,于是决定先专心做服务端,做好测试和模拟,后面再去做客户端做联调。

这两天做的主要事情是:技能初步,怪物逻辑。

技能那边。一个技能释放出去之后,涉及的流程是:判断技能释放是否成功,计算技能产生的伤害,将技能效果广播到周围玩家。技能按释放目标分类,可以分为对地释放和对目标(怪物或玩家)释放,对自身使用的技能算是对目标释放的一种特殊形式。而按照效果分类,可以分为攻击/状态。我想把技能的计算尽量放到agent中,也就是负责玩家的goroutine中,这样可以减轻scene的heartbeat时的计算负担。agent将技能计算好之后,将效果发给scene,由scene再广播给周围玩家。对目标释放的技能可以这么做,但是对地释放的范围类技能,还是放到scene中会好一些。

计算技能效果是比较偏上层逻辑,暂时还没具体去策划各个技能。主要就是一些属性计算,自己的基础攻击,命中,敌人的闪避,防御。而像攻击,命中,闪避,防御这些都属于二次属性,是需要像力量,敏捷一类的基础属性,以及玩家身上的状态来计算得到的。公式计算这一块应该是计算量还算大的,放在不同goroutine中分摊开销。

怪物逻辑这边,以前玩的游戏的时候看到各种各样的表现形式,当时不懂,现在自己思考一下立马能推理出是怎么做的。比如怪物如果死盯着第一个它发现的敌人攻击,像神魔大陆中那样,那明显就是设计时偷懒,怪物的结构体上设定一个目标就不改了。天龙八部上好像也是的,偷懒的做法没有计算仇恨值,所以由比较T的职业去引怪,引完怪都盯着T打,奶到旁边加血,只要T不死,怪就不去打其它人。像剑三和WOW这一类明显就是做得更复杂的。

然后有的游戏中怪物会一直追玩家,而有的游戏中怪物追一段就回去出生地了。这个区别就是会回去的怪物是设定了一个活动区域的,出了活动区域就会脱离。至于脱离的情况,有的游戏中一旦脱离,怪物直接就满血了,而有的游戏中是怪物受伤后会慢慢回血,也有的游戏中是怪物受伤后一直就那个血量了。直接满血的做法,和一直保持血量的做法是更好一点的。云风大神提到过这一块的优化,由玩家接近怪物后,aoi模块来激活怪物,只有激活了的怪物会心跳,未激活的怪物不做心跳,这样可以节省计算开销。而如何要慢慢回血,就需要每次心跳时处理未激活的怪物了。

关于怪物的重生,目前地图信息中记录了两种出生信息,一种是Enemy,一种是EnemyGroup。前者是单个怪物,类型,坐标和活动范围等,而后者是一组怪物,记录了最多/最少数目,出生范围信息。怪物的结构体中有个是否死的的标志位,还有时间信息,如果死掉了,就隔一段时间后根据出生信息进行重生。

在scene中,对每个生物都有一个id编号,我用了一个uint32,用这个id可以获取对应的实体。为了区分玩家和npc,玩家的最高位是0,而npc最高位是1。scene中有几个数组,有记录玩家,有记录怪物,用id与mask做与运算之后,得到的下标去相应数组中查找就可以得到相应的实体。aoi模块中使用的编号也用这个id了。

好吧,继续代码吧。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK