【微信小遊戲】排行榜概念篇

1、前提

  微信小遊戲主打社交玩法,爲了豐富社交玩法咱們確定會用到關係鏈數據來作好友排行幫,羣排行榜等功能。本篇主要介紹概念同時劃重點,下一篇Cocos Creator中實戰html

2、概念

一、1)關係鏈數據:

  一個微信用戶的關係鏈數據包括兩部分:json

  1. 該用戶好友的用戶數據
  2. 該用戶所在的某個羣的羣成員的用戶數據。

  2)經常使用的API:

  1. wx.getFriendCloudStorage() 獲取當前用戶也玩該小遊戲的好友的用戶數據
  2. wx.getGroupCloudStorage() 獲取當前用戶在某個羣中也玩該小遊戲的成員的用戶數據
  3. wx.removeUserCloudStorage() 刪除用戶託管數據中指定字段的數據
  4. wx.getUserCloudStorage() 獲取當前用戶的託管數據

  注意:

  wx.getUserCloudStoragewx.getFriendCloudStorage() 和 wx.getGroupCloudStorage() 只能在 開放數據域 中調用。canvas

  wx.setUserCloudStorage() 和 wx.removeUserCloudStorage() 能夠同時在 主域 和開放數據域中調用。api

二、開放數據域

  開放數據域 是一個封閉、獨立的 JavaScript 做用域。要讓代碼運行在開放數據域,須要在 game.json 中添加配置項 openDataContext 指定開放數據域的代碼目錄。服務器

{
  "deviceOrientation": "portrait",
  "openDataContext": "src/myOpenDataContext"
}

  同時還須要在該目錄下建立 index.js 做爲開放數據域的入口文件,其代碼運行在開放數據域。game.js 是整個遊戲的入口文件,其代碼運行在 主域。對應以上配置,應該有以下的目錄結構:微信

├── src  
|   └── myOpenDataContext
|       ├── index.js
|       └── ...
├── game.js
├── game.json
└── ...

  src/myOpenDataContext 是 開放數據域的代碼目錄,除 src/myOpenDataContext 之外是 主域的代碼目錄post

  主域和開放數據域中的代碼不能相互 require。以以下的目錄結構爲例:ui

├── 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')spa

三、主域和開放數據域的通訊

  開放數據域不能向主域發送消息。code

  主域能夠向開放數據域發送消息。調用 wx.getOpenDataContext() 方法能夠獲取開放數據域實例,調用實例上的 OpenDataContext.postMessage() 方法能夠向開放數據域發送消息。

// game.js
let openDataContext = wx.getOpenDataContext()
openDataContext.postMessage({
  text: 'hello',
  year: (new Date()).getFullYear()
})

  在開放數據域中經過 wx.onMessage() 方法能夠監遵從主域發來的消息。

// src/myOpenDataContext/index.js
wx.onMessage(data => {
  console.log(data)
  /* {
    text: 'hello',
    year: 2018
  } */
})

四、展現關係鏈數據

  若是想要展現經過關係鏈 API 獲取到的用戶數據,如繪製排行榜等業務場景,須要將排行榜繪製到 sharedCanvas 上,再在主域將 sharedCanvas 渲染上屏。

// src/myOpenDataContext/index.js
let sharedCanvas = wx.getSharedCanvas()

function drawRankList (data) {
  data.forEach((item, index) => {
    // ...
  })
}

wx.getFriendUserGameData({
  success: res => {
    let data = res.data
    drawRankList(data)
  }
})

  sharedCanvas 是主域和開放數據域均可以訪問的一個離屏畫布。在開放數據域調用 wx.getSharedCanvas() 將返回 sharedCanvas。

// src/myOpenDataContext/index.js
let sharedCanvas = wx.getSharedCanvas()
let context = sharedCanvas.getContext('2d')
context.fillStyle = 'red'
context.fillRect(0, 0, 100, 100)

  在主域中能夠經過開放數據域實例訪問 sharedCanvas,經過 drawImage() 方法能夠將 sharedCanvas 繪製到上屏畫布。

// game.js
let openDataContext = wx.getOpenDataContext()
let sharedCanvas = openDataContext.canvas

let canvas = wx.createCanvas()
let context = canvas.getContext('2d')
context.drawImage(sharedCanvas, 0, 0)

五、限制

  當小遊戲啓動開放數據域,即在 game.json 中添加 openDataContext 配置項時。小遊戲環境會對主域和開放數據域應用一些限制。

  1)主域

  1. sharedCanvas 只能被繪製到上屏 canvas 上。
  2. 上屏 canvas 不能調用 toDataURL,其 context 不能調用 getImageData。
  3. sharedCanvas 不能調用 toDataURL 和 getContext。
  4. 不能將上屏 canvas 和 sharedCanvas 以任意形式繪製到其餘 canvas 上,包括 drawImage、createPattern、texImage2D、texSubImage2D。

  2)開放數據域

  開放數據域只能調用有限的 API,以下所示:

  幀率

  1. requestAnimationFrame()
  2. cancelAnimationFrame()

  Timer

  1. setTimeout()
  2. clearTimeout()
  3. setInterval()
  4. clearInterval()

  觸摸事件

  1. wx.onTouchStart()
  2. wx.onTouchMove()
  3. wx.onTouchEnd()
  4. wx.onTouchCancel()
  5. wx.offTouchStart()
  6. wx.offTouchMove()
  7. wx.offTouchEnd()
  8. wx.offTouchCancel()

  畫布

  1. wx.createCanvas()

  開放數據域的全部 canvas 只支持 2d 渲染模式

  圖片

  1. wx.createImage()

  開放數據域的 Image 只能使用本地或微信 CDN 的圖片,不能使用開發者本身服務器上的圖片。對於非本地或非微信 CDN 的圖片,能夠先從主域 wx.downloadFile() 下載圖片文件,再經過 wx.postMessage() 把文件路徑傳給開放數據域去使用。

  開放數據

  1. wx.getFriendCloudStorage()
  2. wx.getGroupCloudStorage()
  3. wx.getUserCloudStorage()
  4. wx.setUserCloudStorage()
  5. wx.removeUserCloudStorage()

  監聽主域消息

  1. wx.onMessage()

3、總結

一、若是沒有本身的服務器,然而還想作排行榜,那必須用到小遊戲的開放數據域,開放數據域與主域之間不能相互require,是一種隔離的狀態。

二、開放數據域可經過API獲取到好友,羣排行數據,獲取到數據後,能夠將內容繪製到離屏畫布。

三、這時主域能夠經過開放數據域實例訪問離屏畫布,而後經過drawImage將離屏畫布繪製到上屏畫布。

4、最後

 歡迎加入QQ羣:418177552

相關文章
相關標籤/搜索