最全面的棋牌行业资讯
棋牌资讯
返回 >
Cocos Creator 棋牌游戏开发模块化与热更新实践
发布时间:2019-09-19 16:29:17编辑:颂游

APP的棋牌游戏常见于大厅 + 子游戏模式的棋牌源码类手游,这类手游通常是由一系列子游戏模块组合而成的棋牌游戏大厅版本。这类棋牌APP特点是游戏模块开发周期短、模块版本迭代快、维护周期长,除了各棋牌源码模块本身玩法逻辑,还需要面对众多子游戏集合的管理模式。

APP类棋牌大厅表面上看似简单,但在模块设计、UI设计、服务端、客户端上需要挑战的问题不少,手游项目管理难度不低于于 RPG、即时战略等游戏类型。

这篇文章主要包含 Cocos Creator 棋牌游戏项目的开发分享,其中包含:

1、大厅 + 子模块的游戏设计思路;

2、Creator 工程物理结构;

3、游戏模块资源结构;

4、使用 GameManager 启动子模块场景;

5、模块化热更新 HotUpdataManager(支持 Creator 2.x);

6、更新包制作与安装包裁剪;

7、基于 Grunt 的分模块资源同步。

一、大厅 + 子模块的游戏设计思路

1.1 应用场景

大厅 + 子模块是棋牌游戏app采用的典型设计方案,大厅为子模块提供入口展示,子模块负责实现具体功能玩法,其中棋牌类游戏是使用大厅 + 子模块最为常见的应用场景。


大厅显示子游戏模块的入口图标,提供子游戏模块下载、更新功能。入口图标可以是静态图片,也可以是一个动画,对于使用 Cocos Creator 来说,大厅列表依赖的是一个图标节点,需要事先规定好节点尺寸用于布局。对于节点中的内容,棋牌游戏大厅列表则不用关心。

1.2 界面模块与游戏模块

常规游戏的模块设计与大厅 + 子模块的设计有什么不同呢?游戏主界面 -> 商店 -> 充值窗口,按照模块化的方式设计也可分为:主界面、商店界面、充值窗口。通过简单的模块划分,也可以由多人协作完成。

这些界面有统一的 UI 风格和逻辑关系,这里笔者将这种形式的模块化称之为界面模块或功能模块,它们属于是一个完整游戏应用的局部,并且不可缺少。

而大厅 + 子模块类型的游戏,子模块可以是一个具有独立 UI 风格、且功能完整的游戏,它内部也是由多个界面模块构成。

看下面的一些游戏模块界面:

界面模块与游戏模块

界面模块与游戏模块

界面模块与游戏模块

棋牌子游戏模块的增减不会影响整体项目,而且它们可以按需求进行打包,其本质只是使用不同的包 ID,用子模块进行不同组合,从而输出为不同的 App。

集合类棋牌游戏大厅模块或主模块可以看成是一个平台或宿主,子模块是其中的一个应用或插件,大厅模块需要做好对子模块的管理,如果是原生游戏,发布到 iOS 或 Android 上,还需要支持模块的更新下载。

1.3 工程设计思路

既然大厅与子模块间相互独立,最为理想的做法是将大厅模块、子模块独立为不同的 Cocos Creator 工程

1.3.1 多工程—多模块

这里简单描述一下项目背景:

发布时部署到各自专属的个 URL 链接之上,同时创建一个主工程做首页,用于串联各个课件工程,将原来模块之间的场景切换,改为** URL 地址切换**,请看下图:

多工程—多模块

LinkURL 组件仅能在 Web 环境下使用,模块之间使用 URL 切换,模块内部则是以场景为单位的界面模块切换。

1.3.2 单工程—多模块

在笔者早期的游戏项目中,因为一些技术问题、时间成本,并未很好解决多工程的结构方案,从而采用的是在单工程 - 多模块的项目结构,这也是本次 Chat 谈及的主要内容。

在一个 Cocos Creator 工程中开发多个游戏,子游戏是按目录结构进行模块划分的,大厅提供基础服务,比如:网络接口、共享关键数据、公共 UI 资源、模块资源更新。

子游戏依赖大厅模块提供的服务、接口、资源等,完成自身模块的功能玩法。

1.3.2 单工程—多模块

同时子模块与子模块之间则不允许有任何接口、资源的依赖。

1.3.3 模块设计

PureMVC 方案

单工程多模块的集合类项目,笔者实践过 PureMVC 作为模块框架。下面简要描述一下笔者是如何将 PureMVC 与 Cocos Creator 相结合的,先看张 PureMVC 的框架图。

棋牌源码模块设计

PureMVC 框架的核心 API 是 Facade,一个 Facade 实例管理了 Model、Controller、View 三个 MVC 核心对象

在 PureMVC 中模型(Model)是以 Proxy 代理呈现,比如实现一个 NetProxy 用于提供网络接口,UserProxy 缓存玩家核心数据,使用 Facade 的实例可以检索到任意 Proxy,调用他的提供的 API 方法。

控制器 Controller 体现为 Command 对象,在 Command 实现一些通用的逻辑操作,比如,登录指令 LoginCommand、错误处理指令 ErrorHandleCommand

PureMVC 框架中 View 分为两个部分:Meditor 与 ViewComponent,笔者在项目中使用一个 Meditor 管理一个或多个 ViewCompone,这里的 ViewComponent 则是 Prefab 的实例(node)。

Meditor 与 Command 都是观察者,可以监听 Facade.sendNotification 发出的通知,只要事先注册或关联相关通知名字即可,然后对通知做出对应处理。

在多模块的项目中,使用一个 Facade 实例管理一个子模块游戏,可以很好的隔离模块中的行为,请看下图所示:

棋牌源码PureMVC 框架

上图就是 PureMVC 支持的多核模型,其实就是实例化多个 Facade,每个 Facade 内部可以自成系统,比如:hallFacade.sendNotification 发出的消息只有大厅 Hall 模块才会接收到。

在笔者的 Cocos Creator 项目中使用 PureMVC 框架,Cocos Creator 只充是当其中的 ViewComponent 角色,但有时并未很好遵守代码规范或为了完成任务省事,会出现在 Cocos Creator 的组件代码中使用 PureMVC 的 API 导致编写的组件代码不可移植,将两个系统给耦合在一起了。

组件代码不能独立测试,因此在使用 PureMVC 做项目框架时需要特别注意。

这里因为篇幅原因,只能对 PureMVC 的使用经验做一个简单介绍,更多内容可移步 PureMVC 官方网站,以及阅读 PureMVC 官方教程。

1.3.4 场景 & 预制做模块入口

子模块入口是使用场景还是预制件,很是让人纠结,之两种方式笔者者尝试过,不论使用那种方式,笔者都设计了一个模块管理器,将其中的模块切换操作封装起来。

场景入口

棋牌源码模块入口

使用场景做入口,使用引擎 API cc.director.loadScene 最为简单。

注意的是场景需要有统一的规范化命名,而且全局不能重复,模块管理器提供一个简单的启动接口,如:GameManager.runGame('模块名') 在不同模块入口之间切换,GameManager 内部可以实现模块更新检查、场景过渡、模块启动广播等。

预制入口

预制入口

笔者还实践过使用 Prefab 做子模块入口,也就是将实例化出的 Prefab 节点作为场景使用,因此笔者自己实现了一个基于 Prefab 的场景管理器,提供 push、pop、run 等方法,场景管理器内部维护了一个视图堆栈,大概如下图所示:

在场景管理器中,一个时刻仅有一个 Prefab 的 node 实例,上图中只有视图堆栈栈顶的 Prefab 才会被实例化,堆栈中保存的是 Prefab 的路径也可以是 UUID,还有它所需要的参数,不过参数是可选的。

( 全文完 )
客服中心

扫一扫 添加BOSS微信

在线客服

李经理 QQ交谈
李经理 QQ交谈
李经理 QQ交谈