W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
一個QQ用戶的關系鏈數(shù)據(jù)包括兩部分: 該用戶好友的用戶數(shù)據(jù) 該用戶所在的某個群的群成員的用戶數(shù)據(jù)。 為了豐富游戲的社交玩法,我們提供了獲取關系鏈數(shù)據(jù)的 API: qq.getFriendCloudStorage() 獲取當前用戶也玩該小游戲的好友的用戶數(shù)據(jù) qq.getGroupCloudStorage() 獲取當前用戶在某個群中也玩該小游戲的成員的用戶數(shù)據(jù) 這兩個 API 的返回結果都是一個對象數(shù)組,數(shù)組的每一個元素都是一個表示用戶數(shù)據(jù)的對象,其結構如下:
屬性 | 類型 | 說明 |
---|---|---|
openId | string | 用戶的 openId |
avatarUrl | string | 用戶的QQ頭像 url |
nickName | string | 用戶的QQ昵稱 |
data | Object | 用戶的游戲數(shù)據(jù) |
用戶的 游戲數(shù)據(jù) 指的是用戶的段位、戰(zhàn)績等游戲業(yè)務特有的數(shù)據(jù),通過調(diào)用 qq.setUserCloudStorage() 可以將當前用戶的游戲數(shù)據(jù)托管在QQ后臺。只有被托管過數(shù)據(jù)的用戶,才會被視為 玩過 該小游戲的用戶,才會出現(xiàn)在 qq.getFriendCloudStorage() 和 qq.getGroupCloudStorage() 返回的對象數(shù)組中。 除此之外,我們還提供了以下 API:
qq.getUserCloudStorage、qq.getFriendCloudStorage() 和 qq.getGroupCloudStorage() 只能在 開放數(shù)據(jù)域 中調(diào)用。 qq.setUserCloudStorage() 和 qq.removeUserCloudStorage() 可以同時在 主域 和開放數(shù)據(jù)域中調(diào)用。
開放數(shù)據(jù)域
開放數(shù)據(jù)域
是一個封閉、獨立的 JavaScript 作用域。要讓代碼運行在開放數(shù)據(jù)域,需要在 game.json 中添加配置項 openDataContext
指定開放數(shù)據(jù)域的代碼目錄。添加該配置項表示小游戲啟用了開放數(shù)據(jù)域,這將會導致一些 限制
{
"deviceOrientation": "portrait",
"openDataContext": "src/myOpenDataContext"
}
同時還需要在該目錄下創(chuàng)建 index.js 作為開放數(shù)據(jù)域的入口文件,其代碼運行在開放數(shù)據(jù)域。game.js 是整個游戲的入口文件,其代碼運行在 主域
。對應以上配置,應該有如下的目錄結構:
├── src
| └── myOpenDataContext
| ├── index.js
| └── ...
├── game.js
├── game.json
└── ...
src/myOpenDataContext 是 開放數(shù)據(jù)域的代碼目錄
,除 src/myOpenDataContext 以外是 主域的代碼目錄
。
主域和開放數(shù)據(jù)域中的代碼不能相互 require。以如下的目錄結構為例:
├── src
| └── myOpenDataContext
| ├── index.js
| ├── util.js
| └── ...
├── lib
| └── render.js
└── game.js
在 game.js 中不能 require('src/myOpenDataContext/util')
在 src/myOpenDataContext/index.js 中不能 require('../../lib/render.js')
開放數(shù)據(jù)域不能向主域發(fā)送消息。
主域可以向開放數(shù)據(jù)域發(fā)送消息。調(diào)用 qq.getOpenDataContext() 方法可以獲取開放數(shù)據(jù)域?qū)嵗{(diào)用實例上的 OpenDataContext.postMessage() 方法可以向開放數(shù)據(jù)域發(fā)送消息。
// game.js
const openDataContext = qq.getOpenDataContext()
openDataContext.postMessage({
text: 'hello',
year: (new Date()).getFullYear()
})
在開放數(shù)據(jù)域中通過 qq.onMessage() 方法可以監(jiān)聽從主域發(fā)來的消息。
// src/myOpenDataContext/index.js
qq.onMessage(data => {
console.log(data)
/* {
text: 'hello',
year: 2018
} */
})
如果想要展示通過關系鏈 API 獲取到的用戶數(shù)據(jù),如繪制排行榜等業(yè)務場景,需要將排行榜繪制到 sharedCanvas
上,再在主域?qū)?sharedCanvas 渲染上屏。
// src/myOpenDataContext/index.js
const sharedCanvas = qq.getSharedCanvas()
function drawRankList(data) {
data.forEach((item, index) => {
// ...
})
}
qq.getFriendCloudStorage({
success: res => {
const data = res.data
drawRankList(data)
}
})
sharedCanvas 是主域和開放數(shù)據(jù)域都可以訪問的一個離屏畫布。在開放數(shù)據(jù)域調(diào)用 qq.getSharedCanvas() 將返回 sharedCanvas。
// src/myOpenDataContext/index.js
const sharedCanvas = qq.getSharedCanvas()
const context = sharedCanvas.getContext('2d')
context.fillStyle = 'red'
context.fillRect(0, 0, 100, 100)
在主域中可以通過開放數(shù)據(jù)域?qū)嵗L問 sharedCanvas,通過 drawImage() 方法可以將 sharedCanvas 繪制到上屏畫布。
// game.js
const openDataContext = qq.getOpenDataContext()
const sharedCanvas = openDataContext.canvas
const canvas = qq.createCanvas()
const context = canvas.getContext('2d')
context.drawImage(sharedCanvas, 0, 0)
sharedCanvas 的寬高只能在主域設置,不能在開放數(shù)據(jù)域中設置。
// game.js
sharedCanvas.width = 400
sharedCanvas.height = 200
sharedCanvas 本質(zhì)上也是一個離屏 Canvas,而重設 Canvas 的寬高會清空 Canvas 上的內(nèi)容。所以要通知開放數(shù)據(jù)域去重繪 sharedCanvas。
// game.js
openDataContext.postMessage({
command: 'render'
})
// src/myOpenDataContext/index.js
openDataContext.onMessage(data => {
if (data.command === 'render') {
// ... 重繪 sharedCanvas
}
})
當小游戲啟動開放數(shù)據(jù)域,即在 game.json 中添加 openDataContext 配置項時。小游戲環(huán)境會對主域和開放數(shù)據(jù)域應用一些限制。
sharedCanvas 只能被繪制到上屏 canvas 上。
上屏 canvas 不能調(diào)用 toDataURL,其 context 不能調(diào)用 getImageData。
sharedCanvas 不能調(diào)用 toDataURL 和 getContext。
不能將上屏 canvas 和 sharedCanvas 以任意形式繪制到其他 canvas 上,包括 drawImage、createPattern、texImage2D、texSubImage2D。
sharedCanvas 的寬高只能在主域設置
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: