子游戏+大厅共享资源临时实现方案

子游戏+大厅共享资源临时实现方案
cc.AssetLibrary.init 每调用一次 不清理上一次的数据
需要 2个全局变量 和 一个 路径临时变量
改造 jsb_polyfill.js jsb_polyfill.js.zip (220.0 KB)

比较适用一开始就 使用全局资源的使用

主main.js
var _uuidToRawAsset = {};
var this_pathToUuid = {};
cc.GAMEFILE = “”;

子游戏 main.js
`cc.INGAME = (jsb.fileUtils ? jsb.fileUtils.getWritablePath() : ‘/’)+“ALLGame/benchibaoma/”;
cc.GAMEFILE = cc.INGAME;
cc.sys.garbageCollect();

if(!cc.benchibaoma || cc.QIANGXING == 1){

cc.benchibaoma = 1;

var _CCSettings = null ;
var  settings = null;
require(cc.INGAME+'src/settings.js');
settings = window._CCSettings;
window._CCSettings = undefined;
require(cc.INGAME+'src/project.js');
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]];
            }
        }
    }
}


for(var ss in settings.scenes){

    cc.game._sceneInfos.push(settings.scenes[ss]);

}

// init assets
cc.AssetLibrary.init({
    libraryPath: 'res/import',
    rawAssetsBase: 'res/raw-',
    rawAssets: settings.rawAssets,
    packedAssets: settings.packedAssets,
    md5AssetsMap: settings.md5AssetsMap
});

}

//你的场景db
var launchScene = “db://assets/changci/changcibcbma.fire”;

// load scene
if (cc.runtime) {
    cc.director.setRuntimeLaunchScene(launchScene);
}
cc.director.loadScene(launchScene, null,
    function () {
        if (cc.sys.isBrowser) {
            // show canvas
            canvas.style.visibility = '';
            var div = document.getElementById('GameDiv');
            if (div) {
                div.style.backgroundImage = '';
            }
        }
        cc.loader.onProgress = null;

    
        cc.GAMEFILE = "";
        console.log('Success to load scene: ' + launchScene);
    }
);

`

返回大厅直接使用
cc.sys.garbageCollect();
cc.director.preloadScene(“dating”, function (v) {

cc.director.loadScene("dating");

});

4赞

楼主关于“大厅+子游戏”的模式我有几个问题想要请教一下:

  1. 大厅的main.js需不需要添加一下热更新路径的代码?
if (cc.sys.isNative) {
         var hotUpdateSearchPaths = cc.sys.localStorage.getItem('HotUpdateSearchPaths');
         if (hotUpdateSearchPaths) {
             jsb.fileUtils.setSearchPaths(JSON.parse(hotUpdateSearchPaths));
         }
     }
  1. 现在我的大厅里有个按钮,想点击按钮然后跳转到子游戏,跳转事件就是require子游戏的main.js,如下:
    playGameOne: function() {
        this._storagePath = ((jsb.fileUtils ? jsb.fileUtils.getWritablePath() : '/') + 'HotUpdate/gameOne');
        require(this._storagePath+"/src/main.js");
       // cc.director.loadScene("game");
    },

如果大厅main.js不加上面的热更新路径代码,点击大厅跳转按钮就会提示找不到子游戏的ccsettings。如果加上的话,一运行游戏就直接打开子游戏,不会打开大厅。我现在想要实现先打开大厅,然后点击跳转按钮再进入到子游戏,请问一下是不是我逻辑哪里写的有问题?

问题 1
热更新路径 那是 更新大厅的
问题2
main。js 是需要改造的 请搜索 论坛 有很多改造main.js

我按照你之前的帖子修改了大厅的main.js,如下:

        cc.INGAME = "";
        if(!cc.dating){
            cc.dating = _CCSettings = require(cc.INGAME+'src/settings.js');
            console.log("===========_CCSettings: " + _CCSettings);
        }else{       
            _CCSettings = cc.dating;
        }
        var settings =_CCSettings;

但是提示undefined,请问为什么settings.js没办法加载进来呢?

JS: ===========_CCSettings: undefined
ERROR: TypeError: undefined is not an object (evaluating 'settings.debug'), location: main.js:22:23

_CCSettings 在 头部申明一个

子游戏资源uuid会导致无法加载后面的资源怎么办啊,用的永远都是第一次加载的

顶三哥

谁看明白了,受累解释一下楼主到底做了什么修改

这种方式就不用为子游戏准备dating.js了吗,我试了一下,这种方式从子游戏无法返回大厅,直接使用cc.director.loadScene(“start”),会报错

JS: 返回大厅
JS: [ERROR]: loadScene: Can not load the scene ‘start’ because it was not in the build settings before playing.

此外,我照着您的jsb_polyfill.js修改我自己构建出来的,在子游戏中依然加载不到大厅的prefab :10:

1赞

cocos creator版本1.8.0

返回大厅还是需要require(‘正确的路径/dating.js’)。

如果大厅项目中动态加载prefab的话,在大厅没有加载过prefab的情况下,在子游戏中是加载不到prefab的,并且这时返回到大厅,大厅里加载prefab的按钮都不响应了,也加载不到prefab了;当在大厅加载过prefab之后,子游戏中才能正确加载到prefab。

当把prefab挂载到场景的脚本中时,在子游戏中就可以加载到了,而不用管大厅是否加载过prefab。

1赞

您好 这个是要把大厅的动态prefab 都挂在到大厅脚本中吗? 然后 子游戏 就可以动态加载调用了?