這篇文章寫于218年下半年,基于cocos creator1.9開發(fā),現(xiàn)在已經(jīng)有更好的方式做排行榜了。
1.****子域的概念:
微信小游戲?yàn)榱吮Wo(hù)其社交關(guān)系鏈數(shù)據(jù),增加了子域的概念,子域又叫 開放數(shù)據(jù)域,是一個單獨(dú)的游戲執(zhí)行環(huán)境。子域中的資源、引擎、程序,都和主游戲完全隔離,開發(fā)者只有在子域中才能訪問微信提供的 wx.getFriendCloudStorage() 和 wx.getGroupCloudStorage() 兩個 API,用于實(shí)現(xiàn)一些例如排行榜的功能。由于子域只能在離屏畫布 sharedCanvas 上渲染,因此需要我們把 sharedCanvas 繪制到主域上。
Cocos Creator 從 v1.9.1 版本開始支持打包到子域。
由于開放數(shù)據(jù)域是一個封閉、獨(dú)立的 JavaScript 作用域,所以開發(fā)者需要創(chuàng)建兩個項(xiàng)目:
主域項(xiàng)目工程(正常的游戲項(xiàng)目)
子域項(xiàng)目工程(通過微信 API 獲取用戶數(shù)據(jù)來做排行榜等功能的項(xiàng)目)
2.****工程的結(jié)構(gòu):
子域只保存了排行榜的滑動列表,加載到主域的children_context上。而主域顯示排行榜的界面相關(guān)的內(nèi)容。
3.****主域和開放數(shù)據(jù)域的通信:
開放數(shù)據(jù)域不能向主域發(fā)送消息。
主域可以向開放數(shù)據(jù)域發(fā)送消息。調(diào)用 wx.getOpenDataContext() 方法可以獲取開放數(shù)據(jù)域?qū)嵗{(diào)用實(shí)例上的OpenDataContext.postMessage()方法可以向開放數(shù)據(jù)域發(fā)送消息。
// game.jslet openDataContext = wx.getOpenDataContext()
openDataContext.postMessage({
text: 'hello',
year: (new Date()).getFullYear()
})
在開放數(shù)據(jù)域中通過 wx.onMessage() 方法可以監(jiān)聽從主域發(fā)來的消息。
// src/myOpenDataContext/index.js
wx.onMessage(data => {
console.log(data)
/* {
text: 'hello',
year: 2018
} */
})
4.****數(shù)據(jù)上傳和拉取:
首先,在主域中,調(diào)用wx.setUserCloudStorage接口,把想上傳到微信的內(nèi)容通過KVDataList的格式儲存。
然后在想要獲取的時候,調(diào)用wx.getFriendCloudStorage接口,注意的是,這個接口只能通過我寫在KVDataList中的key,拿到我微信好友中玩過這個游戲的玩家數(shù)據(jù),我們的排行榜就是通過這個接口來獲得數(shù)據(jù)的。
最后說說群排行的做法,調(diào)用的是wx.getGroupCloudStorage接口,這個接口能拿到我分享的群消息,調(diào)用方式和上面如出一轍。
5.****子域的發(fā)布:
打開主域項(xiàng)目,在 菜單欄 - 項(xiàng)目中打開構(gòu)建發(fā)布面板,選擇 Wechat Game 平臺,填入 [子域代碼目錄],該目錄是子域構(gòu)建后所在的路徑,并且這個路徑需要放在主域構(gòu)建目錄下。然后點(diǎn)擊構(gòu)建。
該步驟會幫用戶自動配置到 game.json 中,用于辨別子域文件在主域發(fā)布包下的所在目錄。
打開子域項(xiàng)目,打開構(gòu)建發(fā)布面板,選擇 Wechat Game 平臺,渲染模式選擇 Canvas 模式或者自動模式,并勾選 [小游戲子域工程],把當(dāng)前工程打包成子域可用的文件。
發(fā)布路徑 設(shè)置為主域中填入的 [子域代碼目錄] 相同路徑,即指定到主域項(xiàng)目工程的發(fā)布包目錄下。
6.****分享介紹
微信分享分為三種:
微信小程序自帶的右上角菜單欄里面的分享功能
正常的主動調(diào)用的分享
群分享
第一種右上角分享需要調(diào)用兩個接口,他們寫在主場景綁定的js代碼的onload之中:
第三種群分享也有個接口要寫在這,目的是開啟群分享:
而一般分享和群分享的調(diào)用方式其實(shí)差不多,都是這個接口:
參考一段我們的代碼,success返回的內(nèi)容中如果有shareTickets表明就是群分享了。
上述代碼還包含了一個關(guān)鍵的群的唯一性判斷。微信給我們提供這么一個接口:
我們現(xiàn)在想做群的唯一性判斷只有通過這個接口獲取到encryptedData然后讓我們后端幫我們解析出來再把openGId返回給我們,再通過這個來對比。
分享還有個功能,可以讓被分享者通過這個打開游戲的時候獲得一個分享者提供的數(shù)據(jù),借由這個功能,我們可以制作邀請功能。
目前,我在query這里傳入我自身的openid作為標(biāo)識符,然后,被分享者打開游戲的時候,通過wx.getLaunchInfoSync接口拿到,在登錄接口傳給服務(wù)器,讓數(shù)據(jù)庫記錄下這個玩家是通過我邀請的,來達(dá)到邀請玩家的功能。
7.****引擎升級后新版本的子域制作
自從引擎升級到2.0.7版本之后,之前使用的方法沒用了,重新修改子域的代碼。
在主域中負(fù)責(zé)繪制子域的node增加一個WXSubContextView屬性。(必須)
子域現(xiàn)在不能使用美術(shù)字體,想辦法用程序字替代。其它內(nèi)容變化不大,可以酌情修改。
有一個分享到群回來看排行榜這個功能由于微信的改動導(dǎo)致現(xiàn)在很雞肋,參考了競品,都是必須點(diǎn)擊自己分享到群的分享頁卡重新進(jìn)入游戲之后再把自己的排行榜刷新,這樣原本的排行榜就被替代了,這個功能暫時隱藏了。
還有就是適配的問題,子域的適配可能會因?yàn)榇笃潦謾C(jī)導(dǎo)致界面資源的橫向拉伸,或者坐標(biāo)偏移,這個需要進(jìn)行適配。