上篇讲到了子弹同步和碰撞检测,但是碰撞之后,坦克是不掉血的,今天就把伤害计算给完成了,同时加了一个5秒复活的效果。另外,说下MGOBE框架的随机数是怎么保证相同的。

 

先看下视频效果吧~

 

 

其实,碰撞检测做完之后,伤害计算就很简单了。逻辑层判断只要子弹碰到了一个敌方玩家,即开始计算伤害。玩家有血量,攻击和防御的数值,只要子弹所属玩家的攻击力减去敌方玩家的防御就可以了。注意,判断一下不要让玩家血量小于0。

 

另外,加了个简单的暴击计算。暴击有暴击概率,因此,需要用到随机数。我们知道,计算机中的随机数都是伪随机的,只要指定了随机种子,那么随机出来的数列就是一模一样的。

 

在MGOBE框架中,每一帧的帧数据中都会携带一个随机种子seed,用这个seed加上每一帧的帧id,就可以把RandomUtil的随机种子初始化为一个确定值。这样,在调用随机数函数的时候,只要调用次数相同,就可以保证每个客户端随机出来的结果是一样的。

 

小游戏联机对战引擎之帧同步(五)_小游戏

 

然后,每次玩家攻击时,都有一个固定暴击率20%。这里,不讲实际游戏中那么复杂的暴击计算(为了提高玩家体验等),就用最简单的逻辑来处理。随机数的范围设为[0,100),然后随机出来的数值落在[0,20)范围内,就认为产生暴击了,暴击伤害翻倍。

 

小游戏联机对战引擎之帧同步(五)_随机数_02

 

最后,当玩家坦克的血量为0时,就做一个消息通知,在GameScene.ts里接收通知,使死亡的玩家可以看到自己复活倒计时。倒计时结束后,把位置复位到最初玩家刚进游戏的位置。同时,把血量设置为满血状态。玩家的初始位置,在游戏初始化的时候就保存在了Global.playerPos对象里。

 

小游戏联机对战引擎之帧同步(五)_碰撞检测_03

 

这部分逻辑比较简单。然后,细心的小伙伴可能发现了,匹配的时候,在15秒超时之后,界面上显示的时间,有时候却不是15。我猜测这是由于,网络延迟,加上本地计时器也有一些偏差,服务器计时器也有可能不是很准。

 

通过大量观察,我发现,一般数字会落在14,15,16,不会偏差太大。于是,我就用比较暴力的手段,当本地计时器到15秒的时候,就停止。或者,当服务器返回超时的时候,本地还不到15秒,就直接设置为15秒,然后停止。这样,就可以保证服务器返回超时,弹出超时对话框的时候,本地计时器显示的也是15了。