数据协议用Protobufjs,网络协议用WebSocket
1、安装nodejs、npm
2、到新建的cocoscreator工程目录,初始化项目:执行npm init -y
3、安装protobufjs5.x版本:执行npm install --save-dev protobufjs@5
4、覆盖原protobuf的loadProtoFile方法
protobuf原来的loadProtoFile方法:
ProtoBuf.loadProtoFile = function(filename, callback, builder) {
if (callback && typeof callback === 'object')
builder = callback,
callback = null;
else if (!callback || typeof callback !== 'function')
callback = null;
if (callback)
return ProtoBuf.Util.fetch(typeof filename === 'string' ? filename : filename["root"]+"/"+filename["file"], function(contents) {
if (contents === null) {
callback(Error("Failed to fetch file"));
return;
}
try {
callback(null, ProtoBuf.loadProto(contents, builder, filename));
} catch (e) {
callback(e);
}
});
var contents = ProtoBuf.Util.fetch(typeof filename === 'object' ? filename["root"]+"/"+filename["file"] : filename);
return contents === null ? null : ProtoBuf.loadProto(contents, builder, filename);
};
这里用了ProtoBuf.Util.fetch来读文件,所以需要重写loadProtoFile方法,用cc.loader.loadRes代替Util.fetch方法来读取文件:
let ProtoBuf = require('protobufjs');
ProtoBuf.Util.IS_NODE = cc.sys.isNative;
// 此方法是将ProtoBuf.Util.fetch函数替换成cc.loader.loadRes函数,以解决在微信小游戏中不能使用XHR的问题
ProtoBuf.loadProtoFile = function(filename, callback, builder) {
if (callback && typeof callback === 'object')
builder = callback,
callback = null;
else if (!callback || typeof callback !== 'function')
callback = null;
if (callback)
return cc.loader.loadRes(typeof filename === 'string' ? filename : filename["root"]+"/"+filename["file"], function(error, contents) {
if (contents === null) {
callback(Error("Failed to fetch file"));
return;
}
try {
callback(error, ProtoBuf.loadProto(contents, builder, filename));
} catch (e) {
callback(e);
}
});
var contents = cc.loader.loadRes(typeof filename === 'object' ? filename["root"]+"/"+filename["file"] : filename);
return contents === null ? null : ProtoBuf.loadProto(contents, builder, filename);
};
CocosCreator已经支持WebSocket,而如果是微信小游戏则用微信提供的WebSocket,具体查看:https://developers.weixin.qq.com/minigame/dev/api/network/websocket/wx.connectSocket.html
工程中两种都实现了,其中浏览器平台已经测试过可行,并且提供了Nodejs服务端工程。
1、假设已经安装了nodejs和npm
2、用VSCode打开工程,并且运行
-
ProtoBuf.ts
:对protobufjs的修改和封装 -
ProtoLoader.ts
:用于加载proto文件 -
Message.ts
:proto msg的基类,并将msg缓存起来 -
ProtoMessage.ts
:插件根据proto文件生成的代码 -
Socket.ts
:WebSocket/WxSocket的具体实现 -
SocketDelegate.ts
:Socket代理类,根据具体平台创建socket,提供统一回调接口供具体Socket调用 -
Network.ts
:网络的逻辑实现,跟用户打交道,连接网络、关闭网络、登录流程、断网、重连都可以在这里处理
将proto转成TS代码,在开发中会有编辑器智能提示。
// 创建连接
let network = new Network();
// 跟protobuf一起使用
let login = new Login();
login.cmd = 'login';
login.name = 'Clever';
login.pw = '123456';
network.send(login);
具体怎么使用可以看教程文档:CocosCreator游戏开发框架(二):怎么用