当creator遇上protobufjs—pbkiller插件

机缘

自从开始写protobufjs的分享教程,就开始坚持不懈的在CocosCreator论坛上自吹自擂,无意见被CocosCreator制作人南塔斯大神看到了。一不小心收到南大神的论坛私信,询问我可否将protobuf的使用制作成Creator的插件,并邀我将插件入驻Creator付费商店。

收到消息的第一时间,我异常兴奋。第一是我的经验分享竟能受到Creator官方大神的关注;其次是居然还可以入驻付费商店,对于程序员来说莫大的欣慰就是可以将代码变换现实中的价值。

pb杀手

通过一段时间的Creator插件学习与protobufjs源码的理解,再结合Creator项目经验,终于完成了第一版插件。在制作插件的过程中,插件的命名是最让我纠结的,因为我在曾经的项目中大量使用xxxHelper,编写了不少辅助工具。这次为了让我的第一个Creator插件看起来很牛逼一点点的感觉,我脑子冒出killer的字样,随后我就叫他:pbkiller

不会美术的程序做的logo

我先让pbkiller做个自我介绍:

pbkiller: 我是一位专业的争对protobuf问题训练有素的杀手,我可以为你轻松搞定protobuf在CocosCreaotr开发中的诸多问题,并且可以让你随意折磨曾经折磨过你的protbuf问题。

一、臣服

让所有Proto都臣服在主人脚下

我pbkiller最厉害的技能是可以快速逮捕proto文件,让他们臣服在主人脚下,不论是在浏览器、手机、桌面环境上。

1. 呼唤

只需要低声轻吟我的名字我就会出现在你的身边,对于我的主人我是非常温柔的。

let pbkiller = require('pbkiller');

2. 让proto文件跪在主人面前

对于proto文件我是残忍的,但请主人预先将所有proto文件放在assets/resources/pb目录,输入loadAll()指令,我会将proto文件一网打尽,让它们全部跪在你的面前。

let pb = pbkiller.loadAll(); //所有proto对象都集中在返回的pb对象上

3. 让json格式同样下跪

如果主人喜欢json格式的proto文件,目前需要麻烦主人先使用protobufjs附带的pbjs工具将proto文件转换成json格式存放在assets/resources/pb目录,同样跪下。

let pb = pbkiller.loadAll('json'); //所有proto对象都集中在返回的pb对象上

4. 逮捕指定文件名中的的proto文件


如果主人只需逮捕某一个或多个proto文件,可以使用loadFromFile。

let pb = pbkiller.loadFromFile('xxx.proto'); 
let pb = pbkiller.loadFromFile(['xxx.proto', 'yyy.proto']); 
let pb = pbkiller.loadFromFile(['xxx.json', 'yyy.json']);

5. 逮捕不同地域的proto文件

主人,我默认的逮捕路径是assets/resources/pb,可以通过下面属性修改路径。

//使用root属性修改路径
pbkiller.root = 'my-pb-path';
//此时逮捕路径为:assets/resources/my-pb-path 
pbkiller.loadAll(); 

二、折磨

虽然我们名字中带有killer,但是最高兴不是一下子把敌人杀掉,而是折磨它,因为他曾经可能折磨过我的主人,所以不能让它死的太简单了,哈哈哈。

1. 揪出一个proto给主人扭打(实例化)

主人,我把proto给你抓来了,你可以使用new关键字,随意扭打proto了。

//逮捕所有proto文件,并指定编译grace.proto.msg包路径下的所有对象
let pb = pbkiller.loadAll('proto', 'grace.proto.msg');
let player = new pb.Player();    //扭打Player
player.name = 'ShawnZhang';      //再踹一脚

2.挨一轮巴掌与低声哭(序列化与反序列化)

主人,让proto挨一轮巴掌使用toArrayBuffer,如果你觉得有点累可以使用toBuffer他们的效果完全是一样的。

let player = new pb.Player();  //先扭打
let data = player.toBuffer();  //再来一巴掌

上面我们把player打成了data,现在把它打回来,让他哭一下就好了,但是只是小声的哭,请下答decode指令。

let player = pb.Player.decode(data); //主人允许你小声哭,回来吧

三、内讧

我:“pbkiller没想到你的话这么多,让你自己我介绍一下下,讲这么大一堆。对待proto这么残忍,又主人主人的,特别肉麻,好恶心”

pbkiller:“这年头,你以为杀手是那么容易当的么,杀手也要学会自我营销,注重用户体验,你以前那种介绍方式out了”。

我:“你居然敢说我out了,小心我把你给kill了”。

pbkiller:“你是老大,你说了算,我看有多少人喜欢你说话的方式” pbkiller一脸鄙夷的神情。

四、正式说明

pbkiller插件是为了在CocosCreator中简化protobufjs库的使用,并且可以让protobuffer工作在浏览器和jsb环境上。

1.安装

pbkiller插件有两种安装模式:

  • install-src:源码模式,此模式会将protobufjs原码导入项目中,不依赖任何外部文件。对npm不熟悉的用户推荐使用此模式安装。
  • install-lite:简化模式,此模式需要提前安装protobufjs npm模块,安装命令:npm install protobufjs@5

安装完成后,会导入如下文件:

  1. protobufjs源码(简化模式无此目录)
  2. pbkiller源码、及fs/path伪装模块
  3. 简单的测试场景和代码
  4. 测试proto文件

下面是导入文件和目录结构:

pbkiller                    
├── protobuf                protobufjs源码
│   ├── bytebuffer.js
│   ├── long.js
│   └── protobufjs.js
├── src                     pbkiller源码
│   ├── fs.js               fs伪装
│   ├── path.js             path伪装
│   └── pbkiller.js         pbkillers核心代码
└── test
    ├── test-pbkiller.fire  测试场景
    └── test-pbkiller.js    测试组件代码
resources                   resource/pb是默认的proto文件存放的根目录        
└── pb                      以下文件为测试用proto文件,可以自行删除
    ├── ActionCode.proto    
    ├── ChatMsg.proto        
    ├── Player.json
    └── Player.proto

2. 快速使用

导入模块

let pbkiller = require('pbkiller');

加载resources/pb目录下所有proto文件

//加载所有proto文件
let pb = pbkiller.loadAll(); 
//实例化proto中的Player对象
let player = new pb.grace.proto.msg.Player();

指定文件格式:[proto|json] 默认为proto

//注意json文件是由protobufjs提供的pbjs工个生成
let pb = pbkiller.loadAll('json');

指定编译的对象路径

let pb = pbkiller.loadAll('proto', 'grace.proto.msg');
cc.log(new pb.Player());

3. 特别注意

在加载proto时可以使用扩�展名为.proto.json�的文件,pbkiller支持两�种混用,但�需要特别注意的如果有proto之间有依赖关系,请保证��依赖文件之间是相同的文件格式。

五、期待

目前pbkiller在Cocos商店已经上架,不过官方为了严格测试整个付费商店的上传、审核、支付等流程,可能还需要等待一段时间才能下载,敬请期待。

我很想知道,你们是喜欢pbkiller的介绍方式,还是我写的介绍方式?期待你的留言。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,376评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,126评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,966评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,432评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,519评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,792评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,933评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,701评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,143评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,488评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,626评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,292评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,896评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,742评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,324评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,494评论 2 348

推荐阅读更多精彩内容

  • 一. 环境准备 我一直在探索cocos H5正确的开发姿势,目前做javascript项目已经离不开 nodejs...
    张晓衡阅读 15,211评论 2 14
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,773评论 6 342
  • WebSocket-Swift Starscream的使用 WebSocket 是 HTML5 一种新的协议。它实...
    香橙柚子阅读 23,796评论 8 183
  • 阿树:你还好吗?我趴在窗前给你写信,十二月了,这里却没下过一场雪。我想着去年冬天我们去玩雪的模样,你哈哈笑着拾起雪...
    晚安仔阅读 210评论 0 0
  • 古时文雅人士讲求食物的精致,觥筹交错,吟诗作对,唐诗伴酒,宋词作茶。而对于普通的百姓而言,也只是箪食瓢饮,在陋室中...
    Aoliou阅读 1,428评论 11 19