#一. 环境准备
我一直在探索cocos H5正确的开发姿势,目前做javascript项目已经离不开 nodejs、npm或grunt等脚手架工具了。
##1.初始化package.json文件
npm init
当新建好cocos-js或creator项目,在项目根目录使用npm init命令,一路回车,将在当前目录创建package.json文件用于nodejs三方模块的管理。关于npm的使用细节网络上有很多教程,在此不用细说。
##2. protobufjs模块

本人最早在cocos2dx 2.x时代就开始用protobufjs模块来操纵protobuf一直到现在。所以下面所有内容都是关于protobufjs在cocos creator中的使用,包括原生平台(cocos2d-js也是大同小异)。
####安装protobufjs到项目
npm install protobufjs@5 --save
使用npm install命令安装模块,注意我们这里使用的是protobufjs 5.x版本。 虽然protobufjs目前最新的 6.x版本,提供了ts、rpc等功能的支持,但接口变化太大,目前还不太会使用。
####安装protobufjs到全局
npm install -g protobufjs@5
使用npm install -g 参数将模块安装到全局,目的主要是方便使用protobufjs提供的pbjs命令行工具。pbjs可以将proto原文件转换成json、js等,以提供不同的加载proto的方式,我们可以根据自己的实际情况选择使用。
#二. protobufjs用法
下面是demo中定义的Player.proto文件的内容
syntax = "proto3";
package grace.proto.msg;
message Player {
uint32 id = 1; //唯一ID 首次登录时设置为0,由服务器分配
string name = 2; //显示名字
uint64 enterTime = 3; //登录时间
}
关于proto具体语法细节这里就不多说了,我们重点如何将Player.proto文件中定义的Player对象在js中实例化、属性赋值、序列化、反序列化操作。
##1. 静态语言中使用proto文件
在c++/java这类静态语言中使用protobuf通常是使用官方提供的protoc命令将proto文件编译成c++/java代码,像下面这样:
protoc --cpp_out=输出路径 xxx.proto
protoc --java_out=输出路径 xxx.proto
将输出路径的文件导入对应语言的工程中使用。
##2. 在creator项目中使用proto文件

javascript是动态语言,可以在运行时产生对象,因此protobufjs提供了更为便捷的动态编译,将proto文件中的对象生成js对象,下面简要讲解一下在creator中具体的使用步骤:
####1.加载proto文件并编译生成proto对象
//导入protobufjs模块
let protobuf = require("protobufjs");
//获取一个builder对象
let builder = protobuf.newBuilder();
//使用protobufjs加文件,并与一个builder对象关联
protobuf.protoFromFile('xxx.proto', builder);
protobuf.protoFromFile('yyy.proto', builder);
...
let PB = builder.build('grace.proto.msg');
这步操作主要是使用protobufjs加载、编译proto文件。
####2.实例化proto对象与属性赋值
let PB = builder.build('grace.proto.msg')
build函数返回值PB对象中将包含的是在proto中定义所有message对象,现在已经成为js对象,可以被实例化,代码如下:
//实例化Player
let player = new PB.Player();
//属性赋值
player.name = '张三';
player.enterTime = Date.now();
####3.proto对象的序列化与反序列化
不说废话,还是直接上代码
...
//使用实例对象上的toArrayBuffer函数将对象序列化为二进制数据
let data = player.toArrayBuffer();
//使用类型对象上的decode函数将二进制数据反序列化为实例对象
let otherPlayer = PB.player.decode(data);
如果幸运你可以在web上使用protobuf了, 为什么只是在web上呢,当你把上面的代码运行在jsb环境下的时候,你会体验到悲催的事情正在发生。
#完整内容点击以下连接
http://www.jianshu.com/p/c4b8a8e3077f




