在egret中使用protobuf

时间:2023-03-09 05:17:35
在egret中使用protobuf

在H5游戏领域,对于服务端与客户端的通信协议有一个选择,那就是使用protobuf.js。对于那些直接使用JavaScript开发的引擎而言,protobuf的导入非常简单,然而egret采用的是typescript语言开发的,直接导入protobuf,在使用中是一定会报错的,也就是要解决ts调用js的问题。

typescript为我们提供这样的一个方案,即是为JavaScript编写一个声明文件*.d.ts,具体的书写方式可以参考这里

我这里自己编写了一份protobuf.d.ts供大家参考,希望对大家有所帮助,节省一些时间。关于如何导入第三方库可以参考我的另一篇文章。下面给出使用方法。

这里给出一个proto文件示例代码

package login;
message Login {
required string userName = 1;
required string password = 2;
optional int32 sex = 3;
required bool isFirstLogin = 4;
repeated string param = 5;
}

相应的使用protobuf的测试代码,注意我这里使用了白鹭引擎载入proto文件的文本内容,如果你是用的typescript而不依赖于引擎的,只需要编写载入proto文件文本的代码即可。

let str:string = RES.getRes("login_proto");
let builder:dcodeIO.ProtoBuf.Builder = dcodeIO.ProtoBuf.newBuilder();
dcodeIO.ProtoBuf.loadProto(str, builder);
let protoroot = builder.build();
let msgCls = protoroot.login["Login"];
let msgObj = new msgCls({userName:"test",password:"123456", sex:1, isFirstLogin:false, param:["test", "array", "param"]});
let msg = msgObj.encode();
let msgDe = msgCls.decode(msg);
console.log(msgDe);

2017.5.10

最近有读者发现在protobuf官方下载的下来的使用我的声明会报错。然后我去查看了一下,然后发现protobuf已经重新实现过了,因此相应的声明也需要重写。但是我发现官方改动使用了很多的新技能,以致于无法适应于egret,而且有typescript的实验功能,比如装饰等,egret的编译器是自己重新实现过的,因此对于这些功能的支持尚需等待egret更新编译器以支持typescript新特性(当然自己去写声明应该也可以跳过这些问题)。考虑到自己的工作比较忙,又不能因此耽误大家的项目,因此,我将之前编译好的protobuf上传到百度网盘,需要的可以下载,另外由于现官方的接口已经有很大改动,因此API文档也会相应上传。

百度网盘

提取码:tdew


修改 2017.9.22

时隔快半年了,才想起这个这里的内容还没有更新。这小半年一直在忙于做游戏,以至于无心其他事情,如今,游戏也快上线了,我也能抽空写写东西了。

这小半年的变化可不小,protobuf的api整个都变了,egret引擎更新到了5.x,配置方式也发生了一些小小的变化,不过影响也不是很大,我们依然能够将protobuf应用在egret中,下一篇博客会介绍。