cocoscreator项目大厅加子游戏解决方案笔记

在独立游戏开发一段时间之后,会有这样的需求,想要做一个app大厅将所有独立游戏整合到一个大厅项目中,并且大厅和子游戏独立更新;

#1. 将独立游戏打入大厅整包中
    1. ccc项目发布中资源获取路径都可从cc.url.raw()获取, cc.url.raw = res/raw-assets/;
    2. 既然资源都可以如此获取,自然子项目发布文件也可以拷贝到此目录下,作为大厅整包发布;
    3.热更新的项目管理也一样,只要在子游戏的main.js中设置第一搜索路径即可;

#2. 大厅修改 【以大厅为横板,第一子游戏为竖版作为笔记案例;】
    1. 更改main.js,主要添加热更路径和横屏切换<这里只做android切换>
#3. 子游戏需改 【参照了论坛大厅+子游戏demo修改】 文章底部将会提供实例代码下载
    1. 子游戏main.js也是主要修改热更搜索路径,主要做了移除之前的搜索路径列表,添加子游戏新的搜索路径列表
        jsb.fileUtils.setSearchPaths([]);
        jsb.fileUtils.addSearchPath(cc.url.raw('resources/single_games/game1'), true);
        jsb.fileUtils.addSearchPath(jsb.fileUtils.getWritablePath() + 'single_games/game1/', true);
        备注: 这里需要注意在require('src/project.js')的时候需要判断重复加载
            if (!cc.game1) {
                cc.game1 = 1;
               require('src/project.js'); 
            }
    2.下方和大厅一样添加自身的横竖屏切换代码
        var size = cc.view.getFrameSize();
        cc.view.setFrameSize(size.height, size.width);
        cc.view.setDesignResolutionSize(size.height, size.width, cc.ResolutionPolicy.FIXED_HEIGHT);
        jsb.reflection.callStaticMethod("org/cocos2dx/javascript/AppActivity","changedOrientation", "(I)V", 2); //1横2竖
    3.子游戏添加了dating.js文件主要用于跳转回大厅
        dating中的搜索路径设置
            jsb.fileUtils.setSearchPaths([]);
            var hall_download = jsb.fileUtils.getWritablePath() + "hall_donwnload";
            jsb.fileUtils.addSearchPath(hall_download, true);
        dating中不重新require project.js
        添加横竖屏切换代码
    4. 删除掉发布出来的 jsb_polyfill.js 文件 
    5. 此时可以将发布出来的 src/ res/ 放入大厅发布目录 res/raw-assets/resources/下

安卓横竖屏切换代码


#4. 每个独立游戏都有自己的字体文件,然而大多数时候大厅和所有子游戏用的都是同一个字体文件ttf,要是打入整包中字体会无限重复,随着打入包体的
    子游戏数目越多包体会加大很多.这里想办法让所有子游戏都使用大厅的字体文件
    main.js中的cc.AssetLibrary对资源的管理都通过jsb_polyfill.js文件中操作, ttf字体文件类型比较特殊, 在生成的字体json文件中可以发现,
    都存放_rawFiles数组中, import文件夹内; 只要把第一次加载jsb_polyfill.js文件时,的字体资源用变量缓存, 之后只要调取字体资源就将之返回, 可通用大厅字体.
    if (cc.AssetLibrary) {
    if (cc.AssetLibrary)  {
        var rawPath = cc.AssetLibrary.getLibUrlNoExt(this._uuid) + "/" + this._rawFiles[0];
        if (tmpTtfPath == null) {
            tmpTtfPath = rawPath
        }
        return tmpTtfPath? tmpTtfPath : rawPath;
    }
    
}

 

示例代码

没有更多推荐了,返回首页