在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中,下一篇博客会介绍。

在egret中使用protobuf的更多相关文章

  1. 在Wcf中应用ProtoBuf替代默认的序列化器

    Google的ProtoBuf序列化器性能的牛逼已经有目共睹了,可以把它应用到Socket通讯,队列,Wcf中,身为dotnet程序员一边期待着不久后Grpc对dotnet core的支持更期待着Wc ...

  2. webapi 中使用 protobuf

    相比json来说,好处是速度更快,带宽占用更小.其效果大致等于json+Gzip. 在webapi中使用protobuf的方法为: 引用nuget包 Install-Package protobuf- ...

  3. 在网络通讯中应用Protobuf

    在网络通讯中应用Protobuf Protobuf的设计非常适用于在网络通讯中的数据载体,它序列化出来的数据量少再加上以K-V的方式来存储数据,对消息的版本兼容性非常强:还有一个比较大的优点就是有着很 ...

  4. 怎样在Spark、Flink应用中使用Protobuf 3的包

    如果在在Spark.Flink应用中使用Protobuf 3的包,因为Spark默认使用的是2.5版本的包,提交任务时,可能会报如下异常: com.google.protobuf.CodedInput ...

  5. Egret中使用P2物理引擎

    游戏中的对象按照物理规律移动,体现重力.引力.反作用力.加速度等物体特性,实现自由落体.摇摆运动.抛物线运动,以及物理碰撞现象的模拟.用于模拟物理碰撞.物理运动的引擎称为物理引擎. 来自瑞典斯德哥尔摩 ...

  6. 在lua环境中使用protobuf

    最近在cocos2dx的项目中,需要在LUA脚本层使用protobuf协议.官方已经推出了很多种语言的版本.但唯独LUA版本不全.于是开始研究protobuf在LUA下的实现,将完整的过程记录了下来, ...

  7. DragonBones龙骨发布后在Egret中的位置

    DragonBones发布后的动画,加载到Egret中场景中,原点的位置在哪呢? DragonBones中的图片位置 导出 加载到Egret中.可见DragonBones中的图片位置原点左下方(0,0 ...

  8. 【咸鱼教程】Egret中可长按复制的文本(例如复制优惠码)

    一 实际效果二 实现原理三 源码下载 在egret中实现长按复制文本效果,一般用于复制优惠码什么的. 一 实际效果         二 实现原理 在egret的游戏元素都是绘制在canvas上的,我们 ...

  9. Egret中的三种单例写法

    1 普通的单例写法 as3中也是这么个写法. 缺点:每个单例类里都要写instance和getInstance. class Single{ private static instance:Singl ...

随机推荐

  1. 快速构建Windows 8风格应用18-基础控件I

    原文:快速构建Windows 8风格应用18-基础控件I 本篇博文主要介绍Windows 8风格应用开发中常用的几种基础控件. ProgressRing: ProgressRing控件常见的效果图: ...

  2. Oracleclient+PLSQL Developer实现远程登录Oracle数据库

    Oracle数据库功能强大.性能卓越,在造就这些长处的同一时候,也导致Oracle占内存比較多.针对这个问题,我们怎样做到取其精华去其糟粕呢? 解决方式:我们能够在局域网内的server上安装庞大的O ...

  3. 手机发送短信JS验证

    function tj() { var phone = jQuery('#phone').val(); var code = jQuery('#verificationcode').val(); va ...

  4. JavaScript等比例缩放图片

    js等比例缩放图片,这个功能非常实用,当网页加载一个尺寸比较大的图片时,往往会把一个网页撑的变形,页面变得很难看,于是我们就想到了用JS去控制超出一定范围的图片,以稳定页面布局,本代码段就是完成了此功 ...

  5. char* 转换成 CString

    真是有意思: CString mess ;    mess = m_chLocalIP; 这样OK,但是写在一行就会报错 CString mess  = m_chLocalIP; //有问题

  6. 逐步在Windows上结合CopSSH + msysGit安装安装Git Server同时集成Git使用Visual Studio

    v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...

  7. NHibernate:教你如何搭建数据访问层?

    NHibernate:教你如何搭建数据访问层? 什么是NHibernate NHibernate 是一个基于.net 的针对关系型数据库的对象持久化类库.NHibernate 来源于非常优秀的基于Ja ...

  8. IOS开发小功能1:引导页的开发

    效果图如上,实现的是一个页面引导页,最后跳到主页面,主页面是一个navigationController,但是导航栏给我隐藏了. 文件目录:自己定制的viewcontroller以及navigatio ...

  9. Power Designer导出实体类和NHibernate xml文件

    Power Designer导出实体类和NHibernate xml文件 今天研究了一下通过PowerDesigner生成实体类和NHibernate所需要的xml文件,方法是通过Power Desi ...

  10. ASP.NET Web API是如何根据请求选择Action的?[上篇]

    ASP.NET Web API是如何根据请求选择Action的?[上篇] Web API的调用请求总是针对定义在某个HttpController中的某个Action方法,请求响应的内容来源于调用目标A ...