四、微信小游戲 --- 開放數據域,好友排行榜的實現


 

相關教程:

微信公眾平台-關系鏈數據使用指南

Egret開放數據域教程

 

Head First

這里以排行榜的實現為例子... 

為了保護關系鏈數據,小游戲增加了開發數據域。

因為你在主項目調用獲取好友數據的API是用不了的。只有子項目,也就是開放數據域項目能獲取。

當要顯示好友排行榜的時候,將子項目當做Bitmap繪制到主項目上

所以總結起來就是:一個白鷺項目放游戲,一個白鷺項目專門放排行榜。

 

 

所以本節我們會有4個項目:

Egret主項目   

主項目發布的小游戲項目

Egret開放數據域項目   

開放數據域項目發布的小游戲項目

 

一、創建主項目

1.1 創建主項目

主項目的創建同第一節一樣。

 

1.2 小游戲項目中設置開放數據域項目路徑

小游戲項目game.json設置開放數據域配置。

稍后我們創建開放數據域項目后,發布到openDataContext中。

 

 

1.3 在主項目中保存用戶積分

保存數據,是在主項目和開發數據域都能調用的,我們在Main.ts里保存用戶數據,使用接口wx.setUserCloudStorage

假如用戶玩游戲得分16,游戲結束時間是1513080573ms,用戶耗時36500ms。

 

主項目Main.ts:

        //Test 保存用戶數據
        let KVDataList = [{
            key:"",
            value:""
        }];

        KVDataList[0].key = "test";
        KVDataList[0].value = JSON.stringify({
              "wxgame": {
                "score": 16,
                "update_time": 1513080573
              },
              "cost_ms": 36500
        });
        
        platform.setUserCloudStorage(KVDataList);

 

platform.ts中增加setUsercloudStorage接口  

主項目platform.ts:

declare interface Platform {

    getUserInfo(): Promise<any>;

    login(): Promise<any>;

    setUserCloudStorage(KVDataList:any):Promise<any>;

}

 

並在發布的小游戲項目platform.js中實現setUserCloudStorage接口  

小游戲項目platform.js:

    //保存用戶數據
    setUserCloudStorage(KVDataList){
      return new Promise((resolve, reject) => {
        console.log("platform.js => 開始保存用戶數據",KVDataList);
        wx.setUserCloudStorage({
          KVDataList: KVDataList,
          success: function (res) {
            console.log("platform.js => 保存用戶數據成功");
            resolve();
          }
        })
      })
    } 

 

這樣在Egret項目Man.ts中調用platform.ts的setUserCloudStorage,最終會調用發布的小游戲項目中的platfrom.js的setUserCloudStorage。

這種寫法比較蛋疼,因為你每一個wx接口的實現都得寫在小游戲項目platform.js中,兩頭都要寫代碼。

 

運行后在微信開發者工具中輸出:

 

 二、創建開放數據域項目

2.1 創建一個Egret項目

同主項目一樣創建

 

2.2 下載官方Demo

Demo地址

沒demo你壓根沒法實現,因為教程壓根沒寫清楚...

 

2.3 根據Demo修改項目

1. 刪除egretProperties.json多余的庫

2. 刪除resource (因為子項目能使用主項目的資源,所以子項目的resource沒用了,圖片都放主項目里)

3. 修改發布路徑

4. 復制粘貼demo中的wx_mini_game.d.ts,不然你在子項目調用微信的API會沒有提示

5. 復制粘貼demo中的wxgame.ts

6. 修改index.html的webgl為canvas模式,fps為60

7. 總結,就是自己項目跑不了的時候,就去復制粘貼demo的!!!

 

2.4 根據Demo修改子小游戲項目

到這里,我們的子項目已經改造完畢了,將子項目發布成小游戲項目。

你創建的項目發布成小游戲后,子小游戲項目會發布到主小游戲項目的openDataContext路徑中。

只需發布一次小游戲,然后每次編譯子項目,都會自動同步更新openDataContext路徑下的代碼,相對方便。

值得注意的是,發布的子小游戲項目會缺文件!!!!!比如index.js什么的都沒有!!!你得復制demo中的到openDataContext中....缺什么復制什么。

 

 2.5 子項目中獲取好友數據

子項目Main.ts:

class Main  extends egret.DisplayObjectContainer{
  
    constructor(){
        super();
        
        //創建一個點擊按鈕
        let btn:egret.Sprite = new egret.Sprite();
        btn.graphics.beginFill(0xff0000);
        btn.graphics.drawRect(100,100,100,100);
        btn.graphics.endFill();
        btn.touchEnabled = true;
        this.addChild(btn);

        //點擊按鈕,獲取好友數據
        btn.addEventListener(egret.TouchEvent.TOUCH_TAP, ()=>{
            //獲取朋友數據
            wx.getFriendCloudStorage({
                keyList:["test"],
                success:res=>{
                    console.log("獲取好友數據:",res);
                },
                fail: err => {
                    console.log(err);
                },
                complete: () => {
                    
                }
            });

        },this);
    } 
}

 

2.6 主項目中顯示子項目

注意子項目的Bitmap要顯示在最上層

主項目Main.ts:

        //繪制離屏canvas
        //主要示例代碼開始
        const bitmapdata = new egret.BitmapData(window["sharedCanvas"]);
        bitmapdata.$deleteSource = false;
        let bitmap:egret.Bitmap;
        const texture = new egret.Texture();
        texture._setBitmapData(bitmapdata);
        bitmap = new egret.Bitmap(texture);
        bitmap.width = this.stage.stageWidth;
        bitmap.height = this.stage.stageHeight;
        this.addChild(bitmap);
        egret.startTick((timeStarmp: number) => {
            egret.WebGLUtils.deleteWebGLTexture(bitmapdata.webGLTexture);
            bitmapdata.webGLTexture = null;
            return false;
        }, this);
        //主要示例代碼結束

 

2.7 運行效果 

運行后,會出現一個按鈕,點擊后獲取到好友數據列表。

 

到此,在開放數據域獲取好友數據列表已實現

下圖將排行榜數據顯示出來,因為只有我一個人,所以數據只有一條...

 

坑總結:

1. 發布開放數據域項目會缺失文件。

必須下載Demo,復制粘貼Demo內的文件。

 

2. 發布的小游戲項目,js文件沒有自動壓縮。體積很大2.25M。

必須進行發布一次HTML5游戲的操作,小游戲項目下的引擎文件才會壓縮到457kb。

或者修改config.wxgame.ts的下面這行

new CompilePlugin({ libraryType: "debug", defines: { DEBUG: true, RELEASE: false } })

為 

new CompilePlugin({ libraryType: "release", defines: { DEBUG: false, RELEASE: true } }),  

 

 

3.子項目能不能使用eui呢?

能使用eui。只不過子項目庫會變大。其實感覺可以接受eui.min.js的205kb。這樣制作排行榜的UI時比較方便。

 

4.子項目的排行榜圖片如何獲取呢?

子項目的圖片可以直接使用主項目的。

下面代碼是子項目的排行榜背景圖片,使用主項目resource/assets/rank_bg.png路徑下的圖片例子。

/**
 * 排行榜面板
 * @author chenkai 2018/5/22
 */
class RankPanel extends eui.Component{
	private rankBg:eui.Image;    //排行榜背景
	private rankList:eui.List;   //排行榜列表

	public constructor(data) {
		super();
		this.skinName = "RankPanelSkin";

		this.rankBg.source = "resource/assets/rank_bg.png";

		//初始化排行榜列表
		this.rankList.itemRenderer = RankListItem;
		this.rankList.dataProvider = new eui.ArrayCollection(data.data);
	}
}

  

5. 主項目如何通知子項目顯示排行榜和關閉排行榜?

主項目向子項目發送消息:

        //向開放數據域發送消息
        console.log("向開放數據域發送消息");
        let openDataContext = wx.getOpenDataContext();
        openDataContext.postMessage({
            text: 'hello',
            year: (new Date()).getFullYear()
        });

  

 子項目接收主項目的消息

//監聽主域發送的消息
wx.onMessage(data=>{
console.log("主域發送來的消息:",data);
});

 

注意子項目是沒法向主項目發送消息的,因為微信沒提供這個接口。

所以排行榜關閉按鈕必須做在主項目中,主項目中點擊關閉排行榜,通知開放域關閉排行榜。

 

 

6. 如何在測試時,添加多個微信用戶來體驗游戲?

登陸公眾平台,在用戶身份->編輯->添加成員。可以添加你的微信分身,並配置權限。

這樣在未發布小游戲時,才能使用其他賬號來開發和體驗游戲。

在getFriendCloudStorage時,就可以獲取到2個測試數據了

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM