分享一个“带房间匹配和帧同步(位置+伤害)”的游戏前后端源码

首先感谢Cocos团队提供了很好的前端工具让我们能做到这一步。如题,这是我们之前一段时间做的一个游戏的完整源码 https://github.com/genxium/TreasureHunterX

由于这类游戏常会遇到匹配不到真实玩家需要机器人加入陪玩,所以这里也提供一个配套的BotServer仓库(非必须,测试时两个浏览器对战即可)

现在前端(Creator v2.2.1)和后端(Golang + gin as httpv1 framework + Gorilla as websocket lib)被调整为了仅支持1v1模式,但后端仅需较为少量的改动即可支持2v2 ~ 5v5(自己公网测过),而前端就没那么方便了很多代码都假设了“刚好两个玩家一局”。所使用的同步算法对UDP也是友善的,具体可参照 http://fabiensanglard.net/quake3/network.php 的说明,我也是对着理论做的实现和调整。

此仓库对应的游戏已经上线在微信小游戏,但由于容量有限我们也没有资源继续维护了,就不发入口了。因为我们是始于实在没有资源更新此仓库了才决定开源,愿有心人能采其可用之处,但相对地我这边原则上不处理新功能建议,bug汇报或者pull requests了,仓库里的文档和注释应该也不会提供翻译或者解释。

关于主要后端代码的解释请参考 https://app.yinxiang.com/fx/5c575124-01db-419b-9c02-ec81f78c6ddc 中“Lifecycle events for networking”的部分,同时此笔记也简要说明了本代码库的网络拓扑结构以及部分设计思路,位置同步的边界情况等。

本代码库中并无“玩家主动发射子弹”这一操作,但经实践是可以做到的,请把“发射子弹”的动作立刻上报到后端(区别于位置信息的规律等间隔上报)。

另,本代码库基于个人爱好及立项时考虑支持5v5或以上场景,所以并没有选用目前流行的Peer2Peer LockStep Sync实现,如果你需要查看Peer2Peer LockStep的资料,可以从这一篇 http://clintonbrennan.com/2013/12/lockstep-implementation-in-unity3d/ 开始。


29赞

mark

求入口

可以试试微信搜"夺宝大作战",但真的不保证有房:joy:

哈哈你们的机器人就直接叫机器人啊

哈哈不然呢,随便起反而没新意啊

连续三次加载资源失败,绿色条加载完成不了,黄色条成功时或者没多久绿色条就会停止加载。第四次绿色条先于黄条加载完成就进去了:14:

居然连机器人都玩不赢:joy:

:joy: 很可能是因为当时vps压力比较大

mark

你这个帧同步跟我理解的那个不太一样啊

嗯,肯定有很多不同看法的 :grin:

总结总结:grinning:

指像单挑篮球的帖子那样的总结么?

这代码全堆在一起了,没有做合理的架构,想维护这套代码困难不小。。。

是的,毕竟是真没资源维护挺久了:joy:

这样吧,如果想看后端,建议从ws/serve.go看起,这里面包括了主要的链接和房间管理,包括有新链接时决定加入随机房间还是指定房间(邀请及断线重连),掉线时根据房间状态让其彻底退出还是进入可等待重连,以及RoomHeap的一些相关接口都有被调用。接着就看models/room.go了,各种消息队列,参与者状态机和最重要的差帧缓存都在里面(也就是"堆成一堆")。

前端就比较差了,主要看Map.js就行,其他的像WsSessionManager虽然看上去重要,但也就是断线重连时比较需要看。

我前端代码看半天,@大风起兮云飞扬 这位大哥居然能看到你里面帧同步什么的怎么实现的,我压根就看出来哪是哪:joy:

没关系,你有兴趣的话先根据我上面说的顺序看比较好,帧同步只看前端或者只看后端都不太好入门,强烈建议在代码之前看看我引用的资料。

mark