问题
白鹭引擎 Egret 是一款 HTML5 游戏引擎。最近要做个要记录玩家分数的微信小游戏,这需要后端支持,但对后端来说这是个极小的需求。
我自己不用云主机,SAE 没用过(GAE 上倒是写过 Python,不过访问太不稳定了)。为了有个能用就行的后端,我选择 LeanCloud。LeanCloud 是一个专门面向手机开发的 BaaS 平台,后台免架设免维护的特点可以让我专注于游戏本身,通过它的后台管理界面,几分钟就搞定了我的后端需求。
但是使用 Egret 与 LeanCloud 对接的时候却出了问题。对基于 TypeScript 语言的 Egret 来说,访问 LeanCloud 有两种选择:
一开始我以为 TypeScript 可以直接调用 js,后来发现需要为 js 库定义 *.d.ts 接口声明才能被 ts文件访问。这里有两个问题,一个是你拿到一个js库,对应的d.ts该怎么写;另一个是Egret对js库导入有特殊规定。但这两个问题都是可解决的。
Egret 提供了 HTTP 请求的功能,因此使用 REST API 似乎也没什么问题。但实际发现,LeanCloud 要求 HTTP 请求必须将数据类型定义为 json。但 Egret 的 URLRequest 又没提供json这个类型( Egret 搬运了 as3 的标准库,as3极盛时还是比较推崇 xml 的,但是现在 Egret没提供 json 就不应该了啊)。访问 LeanCloud 时返回 401 错误,因此此方案无解。
最终采用的是 JS SDK + d.ts 的方案。
编写 d.ts 文件
编写 d.ts 文件时应该先看下 TypeScript 文档中 defination file 的相关章节。我根据自己需要编写的 d.ts 文件如下:
declare module AV {
function initialize(id:string, key:string):void;
module Object {
function extend(name:string);
function save();
function get();
}
interface Query_Static {
new(m: any): Query_Instance;
}
interface Query_Instance {
get(key:any, funs:any);
}
var Query: Query_Static;
}
d.ts的一个目的是提供类型检查的,为了方便,我都用 module 的无参声明或者将 interface 的函数参数类型设置为 any。
这样一来,就能直接把 LeanCloud 提供的 js 示例代码贴进 ts 里了。比如统计玩家的游戏次数:
AV.initialize("your_app_id", "your_app_key");
var GamePlay = AV.Object.extend("GamePlay");
var gamePlay = new GamePlay();
var query = new AV.Query(GamePlay);
query.get("your_data_row_key", {
success: function(gamePlay) {
var oldTotalTimes = gamePlay.get("totalTimes");
gamePlay.set("totalTimes", oldTotalTimes+1);
gamePlay.set("totalTimes", gameInst.scoreAll);
gamePlay.save(null, {
success: function(gamePlay) {
console.log("玩家游戏次数已提交");
},
error: function(gamePlay, error) {
console.log("提交玩家游戏次数时出错");
}
});
},
error: function(object, error) {
console.log("读取玩家游戏次数时出错");
},
})
将第三方库导入 Egret
参考 Egret 社区里这篇文章,具体操作如下:
- 下载 JS SDK,取出 av-core.js,放进工程目录中的 src 文件夹里。
- 将自己编写的 av-core.d.ts 文件放进工程目录中的 src 文件夹里。
-
在工程根目录创建一个名为 av-core.json 的库声明文件,填入下面的内容:
{
"name": "av-core",
"dependence": ["core"],
"source":"src",
"file_list": [
"av-core.d.ts",
"av-core.js"
]
}
-
在工程目录中的egretProperties.json中的modules节点下,添加
{
"name": "av-core", "path":"."
}
在工程目录下执行命令行
build -e```编译LeanCloud库。
## 运行 ##
bash
egret build
egret startserver
附件
提供一个统计所有玩家游戏启动次数总和的 Demo,刷新页面时启动次数增加。
