如何在游戏中写一个战斗模块

这里假设一个场景,登录一款游戏后进入大厅,显示欢迎信息,然后选择战斗模式,例如王者荣耀中的5V5,那么这个功能要如何实现呢?

按照游戏流程,可以想到有这几个阶段:

其中第一步,要保证整个队伍里面的所有人都成功加载地图,不然就不是5V5了,可能就变成了5V3,因为其他两个人没有成功加载地图。所以,需要一个机制,所有客户端都成功加载地图后才去告诉服务器正真开始战斗。但是总有一些意外,例如有个队友一直加载地图失败,卡住了,那么就不能让其他人一直去等待,这里可以加入一个超时的判断,超过一定时间后强制开启战斗。还有一种可能,这个队友突然断网了,也会出现类似的情况。

但是不是只要客户端加载地图就可以了呢?不是,在游戏中,客户端只是对服务器逻辑的表现,所以,服务器也要加载地图,对于战斗中的碰撞,例如子弹的射中与否,玩家的位置信息,都是根据服务器中的信息来决定的,所以,第一步中还需要加入服务器的加载逻辑,所以,总的步骤应该是服务器开始加载地图,同时通知客户端开始加载地图,当所有的客户端加载完毕,服务器也加载完毕后,那么就可以进入下一步了,开始战斗。

要开始战斗,必须先要有玩家,包括队友和敌人,那么这个信息是从哪来的呢?当然是服务器下发的,就在第一步加载地图的时候下发的,因为加载地图也就意味着需要创建出人物模型来。接着便是玩家操作 NPC 进行打斗了,这里包括但不限于移动位置,使用武器等。这里有一个问题,NPC 的位置、血量、有没有被打到等信息都是由服务器决定的,所以客户端在做任何操作的时候都需要给服务器发送命令,也就是要告诉服务器自己要做什么,服务器来做一些验证和记录,然后将结果通知客户端,客户端再去执行相应的表现,如果玩家的网络不好,很卡,那么他发给服务器的命令和接受到服务器返回的命令直接就会有很大的延迟,客户端的表现也会有相应的延迟。那么如何确定一个攻击有没有打到对方呢?还是服务器说了算,因为客户端只做表现,不做逻辑判断,所以就有可能出现客户端中一颗子弹没有打中,但是服务器判断打中了的情况,所以需要尽量避免这种情况。这就涉及到了另一个方面,游戏中的状态同步问题。

關於遊戲中的狀態同步,以後有時間再寫吧