一、前言
根据上一篇(Cocos Creator热更新),可以看出以下几点:
- build-default目录下的main.js,为cocos creator项目的入口;
- 热更新一文中,放置在服务器上的,仅有资源,脚本,配置等,没有入口程序,因此本文中,我们需要创造一个入口程序。
还是解释一下什么叫大厅+子游戏模式:
1. 将大厅单独作为一个完整的项目,不同的子游戏,则为不同的项目
2. 然后要实现不同项目之间的互调,即大厅调子游戏,或者子游戏调大厅
3. 资源共享,共用的资源放在大厅项目中,并且子游戏中可以调用
这样做的好处:
1. 减小上架包的体积
2. 提高热更新的效率(打开指定子游戏,才会更新子游戏)
3. 降低项目的耦合性(如果不共享资源,子游戏完全可以随时抽取出来作为一个单独的包使用)
二、修改子游戏
1. 添加version_generato.js
2. 构建项目
3. 在原生src下,添加 main.js 入口文件
3.1 每次构建完项目,拷贝main.js到原生目录的src中
main.js的内容如下:
(function () {
'use strict';
if (window.jsb) {
/// 1.初始化资源Lib路径Root.
var subgameSearchPath = (jsb.fileUtils ? jsb.fileUtils.getWritablePath() : '/')+'ALLGame/subgame/';
/// 2.subgame资源未映射,则初始化资源映射表,否则略过映射.
if(!cc.HallAndSubGameGlobal.subgameGlobal){
cc.HallAndSubGameGlobal.subgameGlobal = {};
/// 加载settings.js
require(subgameSearchPath + 'src/settings.js');
var settings = window._CCSettings;
window._CCSettings = undefined;
if ( !settings.debug ) {
var uuids = settings.uuids;
var rawAssets = settings.rawAssets;
var assetTypes = settings.assetTypes;
var realRawAssets = settings.rawAssets = {};
for (var mount in rawAssets) {
var entries = rawAssets[mount];
var realEntries = realRawAssets[mount] = {};
for (var id in entries) {
var entry = entries[id];
var type = entry[1];
// retrieve minified raw asset
if (typeof type === 'number') {
entry[1] = assetTypes[type];
}
// retrieve uuid
realEntries[uuids[id] || id] = entry;
}
}
var scenes = settings.scenes;
for (var i = 0; i < scenes.length; ++i) {
var scene = scenes[i];
if (typeof scene.uuid === 'number') {
scene.uuid = uuids[scene.uuid];
}
}
var packedAssets = settings.packedAssets;
for (var packId in packedAssets) {
var packedIds = packedAssets[packId];
for (var j = 0; j < packedIds.length; ++j) {
if (typeof packedIds[j] === 'number') {
packedIds[j] = uuids[packedIds[j]];
}
}
}
}
/// 加载project.js
var projectDir = 'src/project.js';
if ( settings.debug ) {
projectDir = 'src/project.dev.js';
}