一个小游戏的通用架构

最近被组织安排去支援了一个基于cocos-js开发的h5小游戏项目,于是稍微整理了下像这样的一个小型游戏项目的架构

功能系统

消息分发系统

它就是一个监听者模式的管理类,一般包含register, unregister, trigger三个接口。它适用于两个场景,一个是接收到服务器消息时,需要更新各个UI界面,让各个页面注册自己感兴趣的消息,当收到后端消息时进行分发。另一个是页面之间的互相影响,为了避免持有引用,一方进行注册监听,另一方进行事件分发。

监听者模式是代码解耦的一大神器,应用也非常普遍,所以第一个想到的就是它,当然它的缺点就是不利于流程的跟踪。

UI管理系统

游戏中一般场景scene并不多,大多数都是在scene上面分布着各种弹窗界面,例如弹出提示框,获得奖励框,各种二级界面等等。如果没有一个管理系统,很容易混乱,要么zorder设置起来累的要死,要么弹窗覆盖导致界面丑陋不堪。

UI管理系统一般提供的接口就是弹出界面和关闭界面,默认会自动设置zorder,并且关闭的界面一般不做销毁,而是从父节点移除后留作下次备用,以提高性能。如果实现的简单,就直接弹出窗口,设置最高zorder即可,复杂些的话可以进行分类管理,哪些节点可被覆盖,哪些不可以,支持什么弹出动画等等。

数据管理系统

前端页面如何展示,依赖于后端传递的数据,这些数据最好使用一个管理系统来全局存储,而不是存在UI类中,这样更有利于解耦。

后端传回的数据现在经常是json格式,可以直接拿来使用,但最好还是解析为model,这样做的一个好处是即使没有协议文档,也很容易明白协议格式,而且可以在model层封装一些特定的接口比如getDataByType等。另外还有一个好处,就是前端代码最终很可能会被深度混淆,如果直接使用json,处处要小心使用[‘xxx’]而不是.xxx的格式,但解析为model后就不用担心了。

具体代码模块

Model模块

前面提到过,后端获得的数据转为model来使用,本地的配置信息等也可以,取决于实际需求

UI模块

包括两部分,一部分是和各个UI界面的实现(在cocos creator上则是绑定在各个界面的脚本),作用是控制UI界面的各个组件显示,实现一些交互逻辑。按层级可以分为scene和window, component等级别。
另一部分是做组件封装,例如给按钮增加防快速点击的功能,给弹窗增加吞触摸事件的背景等等

看到model和UI,就知道项目其实还是MVC这个万金油结构,这里提到了model和view,上面提到的数据管理系统就可以当做controller了。

网络模块

实现网络通信功能,一般都需要保持长连接,在浏览器中使用websock,或者在原生端封装tcp。一般就是实现open, onConnect, onDisconnect, onMessage, send这几个接口。

这里需要提到的就是最好在网络模块中实现一个比较完善的mock系统,它可以和真正的网络模块无缝切换,接口完全一致,唯一的区别就是在send函数里,对需要mock的接口使用mock的数据回调onMessage,其它接口走真正的网络请求。这样非常灵活,使用方便,功能比单纯在代码中mock一下数据要强大很多。

Utils模块

只要比较独立的代码,都往里面扔就是了,一般Constants,Global,Enums三大巨头就够用了,要继续细分也可以,比如EventName啥的

manager模块

就是上面提到的消息监听,数据管理,ui管理三大功能系统的实现,它们可以适用于任何项目,实现一套后要么直接搬来用,要么封装成公共sdk都可以

总结

一般的小游戏,有这样的框架,绝对够应付的来了,在这个框架的基础上可以继续细分,但跑不掉还是这些。不论是新建一个项目,还是重构已有项目,都可以按这个结构来。