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

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

先看下视频效果吧~

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

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

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

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

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

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

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

如果文章内容对你有用,欢迎点赞和转发~

扫描二维码

获取更多精彩

如若清风

关注公众号,回复666666

 即可领取学习大礼包

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值