Skip to content

Instantly share code, notes, and snippets.

@rangercyh
Forked from xjdrew/README.md
Created November 19, 2018 02:43
Show Gist options
  • Save rangercyh/797e1956cc0b2000d21295abd43559dd to your computer and use it in GitHub Desktop.
Save rangercyh/797e1956cc0b2000d21295abd43559dd to your computer and use it in GitHub Desktop.
多人战斗转发服务

功能

实现多个玩家联机战斗时的操作转发。

流程

玩家先通过组队服务,组好队伍。队长点击开始攻击后,玩家获得本次战斗的token,再连接战斗转发服务。

战斗转发服务为每个队伍创建一个房间,并仅允许该队伍的玩家加入该房间。房间内的每个玩家是完全平等的,所以每个玩家都不能发送指示性指令,比如开始战斗,结束战斗之类的。

每个玩家根据协议发送自己的状态信息,由服务决定当前应处的状态。

战斗同步

帧速

每秒切成的分片数。比如帧速为30,就是每秒被切成30片,每帧时长1/30秒。第8帧 从7/30开始,至8/30秒结束。

关键帧

真正执行玩家操作的那一帧。玩家可以在任何时候发起操作,但是为了适当同步多个玩家的操作,会人为规定,每隔X帧,就有一个关键帧。

锁帧

玩家在非关键帧产生的操作都会缓存,直到下一个关键帧来临时,再统一广播给客户端。

协议

加入房间[join]

  1. 若房间不存在,则创建房间
  2. 若战斗未开始,则加入房间,返回加入成功,及当前已经在房间玩家列表
  3. 若战斗已开始,返回错误码

加入房间通知[join_notify]

当有新玩家加入,向所有已加入房间成员发送加入通知。

开始战斗通知[start_notify]

  1. 所有队员都加入房间,立即开始战斗
  2. 从第一个队员加入房间起,X分钟后还未完全就绪,也立即开始战斗。

战斗操作[send_packet]

开始战斗后,玩家的操作发送给服务器保存

战斗操作转发[packet_notify]

关键帧来临的时候,所有缓存的操作将广播给房间中所有玩家。

结束战斗[quit]

所有用户发送了结束指令或者断开连接,战斗结束,关闭房间。

掉线通知[quit_notify]

在等待组队和战斗中,玩家都有可能掉线。异常掉线会向其他玩家通知。组队过程中异常掉线,如果战斗还未开始,还可以重新连接后加入进来。

协议编码

使用sproto

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment