微信雲開發技術可讓咱們免費方便的使用服務器的部分功能,對於微信小遊戲很是有幫助。數據庫
本教程只針對新人,由於我本身就是個新人,若有錯誤,請你們批評指正。json
1. 微信雲開發服務端每一個小遊戲能夠配備兩個雲開發服務器,推薦一個用來測試,一個用來發布。首先咱們把作好的遊戲構建、運行,在微信開發者工具中打開雲開發,如圖所示:服務器
打開後的頁面以下,輸入環境名稱,自動生成一個環境ID微信
點擊肯定,進入雲開發控制檯,這裏咱們就能夠從上面看到它的功能:數據庫、存儲管理、雲函數,請看下圖:網絡
接下來試一下雲函數功能,建立一個雲函數,查看一下基礎信息微信開發
在圖中能夠看到提交方法,按照步驟操做 ,加入這一行代碼,左邊新建一個文件夾,請看下圖:ide
左邊新建Node.js函數,取個名字,好比「getopenid」,右邊能夠編寫雲函數代碼,也是js代碼,只不過是運行在雲開發環境的js代碼函數
完成後,右鍵上傳部署,以後再次構建就能夠直接使用了,無需再次重複這些步驟工具
2. 小遊戲中的調用方法//初始化雲服務器post
wx.cloud.init({
traceUser: true,
env: 'box-8e6f64'
})
//調用雲函數
wx.cloud.callFunction({
name: 'getopenid',
complete: res => {
cc.sys.localStorage.setItem('openid', res.result.openid);
}
})
利用這種方法就能夠取到openid了,用戶上傳分數的時候能夠利用openid查詢一下是否已存在記錄,避免重複上傳。
如今雲函數控制檯點擊數據庫建立本身須要的表,無需建立字段,只要有名字就能夠,好比worldrank而後就能夠在小遊戲裏進行增刪改查操做了,看下面代碼:
const DB = wx.cloud.database()
DB.collection('worldrank').where({
_openid: cc.sys.localStorage.getItem('openid'),
})
.get({
success(res) {
//console.log(res.data[0]._id)
if (res.data.length > 0) {
DB.collection('worldrank').doc(res.data[0]._id).update({
data: {
score: myscore
},
success(res) {
}
})
}
else {
DB.collection('worldrank').add({
data: {
score: myscore
},
success(res) {
}
})
}
}
})
經過小遊戲上傳的數據會自動增長一個openid字段,存放用戶的openid,也就是說上面這段代碼上傳到數據庫後,worldrank表裏存放的是:
{
'id':'自動生成',
'_openid':'用戶openid',
'score':'用戶得分'
}
更多數據庫使用方法請參考官方文檔。
有了玩家的數據,而後就能夠進行製做排行榜了,查詢數據庫,將數據排序後發送到開放數據域,開放數據域接收後就能夠直接繪製了
DB.collection('worldrank').limit(20)
.orderBy('score', 'desc')
.get({
success: function (res) {
wx.postMessage({
rankdata: res.data,
});
}
})
limit(20)表示只能取20條數據,在小遊戲端查詢數據庫最多隻能查詢20條記錄,若是把調用方法寫到雲函數裏,則能夠查詢到最多100條數據,官方有例子能夠循環屢次取出全部數據,可是咱們只作排行榜的話100條數據已經足夠了。 開放數據域接收到rankdata,也就是前面的這樣一組json數據:
{
'id':'自動生成',
'_openid':'用戶openid',
'score':'用戶得分'
}
而後經過getUserInfo獲取用戶的頭像、暱稱信息、繪製排行榜,具體代碼以下:
for (var i = 0; i < rankdata.length; i++) {
var list = [];
var score = rankdata.score;
list.push(rankdata._openid);
wx.getUserInfo({
openIdList: list,
success: (userRes) => {
let userData = userRes.data[0];
var avatarUrl = userData.avatarUrl;
var nick = userData.nickName;
},
fail: (res) => {
this.loadingLabel.getComponent(cc.Label).string = "數據加載失敗,請檢測網絡,謝謝。";
}
})
}
補充:game.json文件加一句"cloud": true。
3. 結語寫得比較匆忙,歡迎補充、交流和吐槽,小遊戲樣例,請忽略這粗糙的美工!