基于protobufjs6.8.0的插件,适用于creator1.6+

#protobufjs
本插件基于protobufjs 6.8.0版本,主要针对自己的项目进行了一点点更改,使之能正常的在跨平台上面使用

#适用范围
cocos creator 1.6版本(1.6之前的版本没有测试过), 如果有问题可以直接联系我QQ657542753

#用法
导入项目,并设置为插件(ps:不要问我怎么导入为插件,不然我打死你!官方文档是有相关介绍的)

#更改
game对象是一个自定义的全局变量,如果大家喜欢用全局变量,可以在以下目录的文件中添加以下内容
window.game = {}

需要添加的文件:
creator安装目录下,在function()内添加:
/Resources/static/simulator/main.js //该目录是用于模拟器的
/Resources/static/preview-templates/boot.js //web
/Resources/static/build-templates/shares/main.js //打包模板

  1. 更改987行附近的函数,注释掉了8192长度,这个数值会造成在把数据转换成arraybuffer时,总是生成8192长度的arraybuffer数组
    function pool(alloc, slice, size) {
        var SIZE   = size //|| 8192;
        var MAX    = SIZE >>> 1;
        var slab   = null;
        var offset = SIZE;
        return function pool_alloc(size) {
            if (size < 1 || size > MAX)
                return alloc(size);
            if (offset + size > SIZE) {
                slab = alloc(SIZE);
                offset = 0;
            }
            var buf = slice.call(slab, offset, offset += size);
            if (offset & 7) // align to 32 bit
                offset = (offset | 7) + 1;
            return buf;
        };
    }

2.更改447行附近的fetch函数,将原有的native判断转换成cc.sys.isNative来判断是否属于本地,
并将原生的读文件操作进行了转换,转换原理:通过creator本身的cc.loader.load函数来获取proto文件,然后将其中的内容返回
var data = game.ResMgr.getProto(name) 这个函数用来获取proto文件信息,
注意!!!游戏开发过程中,常用的内容一般都会走预先加载的流程,所以我这边直接获取是没有问题的

    data = {
        url : 文件在本地的正目录,
        name :文件名
        content : 文件内容
    }
    function fetch(filename, options, callback) {
    if (typeof options === "function") {
        callback = options;
        options = {};
    } else if (!options)
        options = {};

    if (!callback)
        return asPromise(fetch, this, filename, options); // eslint-disable-line no-invalid-this

    // if a node-like filesystem is present, try it first but fall back to XHR if nothing is found.
    console.log("cc.sys.isNative)",cc.sys.isNative)
    if (cc.sys.isNative)
        try {
            // 这边通过解析文件名字,然后用cc.loader.load来加载文件
            var start_idx = filename.lastIndexOf("/") + 1
            var end_idx = filename.lastIndexOf(".")
            var name = filename.substring(start_idx, end_idx)
            var data = game.ResMgr.getProto(name)
            return callback(null, data.content)
        } catch (e) {
            return null;
        }
    // use the XHR version otherwise.
    return fetch.xhr(filename, options, callback);
}

3.更改 4207行附近 将 // name = applyCase(name);注释的原因是因为这个函数会把所有非字母数字的符号去除,
将原有的变量名字强行更改成驼峰式命名,如,我们项目里的变量大多是abc_def的,如果这个函数没有注释的话,则会被abcDef替换,
导致最终获取不到这个对象,发送或者接收的数据缺失

// name = applyCase(name)

附件:protobufjs.zip (58.3 KB)
github地址

5赞

Good Job :heart_eyes:
Thanks for Share !

马克!!!!!

需要添加的文件:
creator安装目录下,在function()内添加:
/Resources/static/simulator/main.js //该目录是用于模拟器的
/Resources/static/preview-templates/boot.js //web
/Resources/static/build-templates/shares/main.js //打包模板

这几个文件非要添加?

为什么不用生成js的方式呢?

这个是介绍全局变量的用法的,这样一次性加完,避免以后换了环境或者构建的时候编译不过或者手动加载,如果不喜欢用全局变量的,也可以直接用cc.loader.load,

game对象是一个自定义的全局变量,如果大家喜欢用全局变量,可以在以下目录的文件中添加以下内容
window.game = {}

需要添加的文件:
creator安装目录下,在function()内添加:
/Resources/static/simulator/main.js //该目录是用于模拟器的
/Resources/static/preview-templates/boot.js //web
/Resources/static/build-templates/shares/main.js //打包模板

不知道怎么使用的可以看下这个
http://forum.cocos.com/t/protobufjs-cocos-creator1-6/50706

师傅威武~

赞一个,