Egret微信小游戏怎么更方便地接入开放域排行榜

引言

微信小游戏接入排行榜可以激发玩家竞争欲望,增加游戏的互动性和挑战性,提高用户的黏性和留存率。同时,排行榜还可以帮助玩家比较自己在游戏中的成绩,增加游戏的社交性和乐趣。那么我们要如何接入开放域排行榜呢?我们先引入一个开放域的概念。本章源码和开放域工程会放在文章末尾,大家有需要的可以自行去获取。

微信小游戏的开放域

微信小游戏的开放域是指通过开放数据域(OpenData)实现的一种功能,它允许小游戏在小程序环境中与其他小游戏共享一部分数据。开发者可以在开放数据域中绘制UI界面、展示排行榜、分享成绩等,并将这些信息展示在小程序的游戏界面上。开放域的数据不会与用户的个人信息相关联,保护用户隐私。开放域为小游戏提供了互动和社交功能,增强了用户体验和游戏的社区性质。

开放域的特点总结如下:

  1. 限制操作:开放域环境下,用户无法进行除了点击和触摸以外的操作,以防止用户通过开放域环境进行恶意操作和作弊。
  2. 无网络访问:开放域环境无法直接访问网络,无法获取用户个人信息和敏感数据,确保用户的隐私安全。
  3. 共享数据:开放域可以通过发送消息和接收消息的方式与主游戏进行通信,实现共享数据和信息。
  4. 自定义UI:开放域可以自定义绘制UI界面,包括按钮、文本框等,提供给用户更多的交互方式。
  5. 多人联机:开放域可以支持多人联机游戏,用户可以与其他玩家进行实时互动和竞技。

总的来说就是,想要获取到玩家的好友并展现给玩家看,就必须要在开放域进行操作,开放域的数据无法传到外界,极大限度地保护了玩家地隐私。

如何接入排行榜

1.将Egret工程导出到微信小游戏。

Egret微信小游戏怎么更方便地接入开放域排行榜_第1张图片

2.导出成功后我们用微信开发者工具打开工程,可以发现工程自带了一个默认的简易排行榜示例。

Egret微信小游戏怎么更方便地接入开放域排行榜_第2张图片

3.在openDataContext目录的index.js我们可以看到:

/**
 * 增加来自主域的监听函数
 */
function addOpenDataContextListener() {
  console.log('增加监听函数')
  wx.onMessage((data) => {
    console.log(data);
    if (data.command == 'open') {
      if (!hasCreateScene) {
        //创建并初始化
        hasCreateScene = createScene();
      }
      requestAnimationFrameID = requestAnimationFrame(loop);
    } else if (data.command == 'close' && requestAnimationFrameID) {
      cancelAnimationFrame(requestAnimationFrameID);
      requestAnimationFrameID = null
    } else if (data.command == 'loadRes' && !hasLoadRes) {
      /**
       * 加载资源函数
       * 只需要加载一次
       */
      // console.log('加载资源')
      preloadAssets();
    }
  });
}

这个方法主要是监听主域发过来的指令,由图中可以看到包含了open、close和loadRes三个指令。那么我们是不是通过这3个指令就可以显示排行榜呢?我们来测试一下。

4.我们在主域中创建并且显示开放域数据。

//添加排行榜
var plathform = window.platform;
if(!plathform.openDataContext) return;
//显示开放域数据
var bitmap = plathform.openDataContext.createDisplayObject(null,this.rankContainer.width, this.rankContainer.height);
this.rankContainer.addChild(bitmap);
egret.startTick((timeStarmp: number) => {
    egret.WebGLUtils.deleteWebGLTexture(bitmap.webGLTexture);
    bitmap.webGLTexture = null;
    return false;
}, this);

5.通过发送指令去加载资源和显示排行榜

//主域向子域发送数据
plathform.openDataContext.postMessage({
    command: "loadRes"
});

plathform.openDataContext.postMessage({
    command: "open"
});

6.调用之后我们可以看到一个简单的排行榜

Egret微信小游戏怎么更方便地接入开放域排行榜_第3张图片

7.然后我们通过修改index.js这个文件内容,可以把排行榜修改成我们想要的样式即可。

Egret微信小游戏怎么更方便地接入开放域排行榜_第4张图片

8.要注意示例里面是简单的假数据展示,我们获取真正的数据要通过wx.getFriendCloudStorage获取:

wx.getFriendCloudStorage({
    keyList: ["rank"],
    success: res => {
        console.log(res);
        var datas: any = [];
        res.data.forEach(
            (value: any, index) => {
                if (value.KVDataList.length > 0) {
                    // console.log(value.KVDataList[0].value);
                    let score = JSON.parse(value.KVDataList[0].value).score;
                    let tmp = datas.length;
                    for (let i = 0; i < datas.length; i++) {
                        if (score > datas[i].scoreBest) {
                            tmp = i;
                            break;
                        }
                    }
                    value.nickName = value.nickname;
                    value.scoreBest = score;
                    datas.splice(tmp, 0, value);
                }
            });
        //展示数据
        this.onShow(data.objData, datas, 0);
    },
    fail: err => {
        console.log(err);
    },
    complete: () => {

    }
});

更方便地接入排行榜

按照上面官方示例接入排行榜的话,有个比较明显的缺点,就是UI没有办法很直观地编辑,只能通过慢慢地调整坐标去构建。那我们如何更方便地接入开放域排行榜?下面和大家分享一下我的踩坑流程:

通过查阅资料发现,我们可以将Egret的基础库导到开放域,甚至还可以将Egret的eui库导到开放域,那么这样我们就可以通过ui编辑器去编辑UI了。下面我们尝试一下用Egret的ui接入排行榜。

1.首先我们导出一个简单的Egret开放域工程。

我们将其命名为开放域工程,大家可以自己导出,也可以在文末获取之后直接修改使用。

Egret微信小游戏怎么更方便地接入开放域排行榜_第5张图片

2.如果大家自己导出记得要复制或者配置下图中红框的几个文件:

Egret微信小游戏怎么更方便地接入开放域排行榜_第6张图片

3.大家可以直接在开放域工程编写UI,笔者写了个插件可以直接在主游戏工程编辑UI,然后通过指令发送到开放域。主要通过UI编码和解码器实现:

Egret微信小游戏怎么更方便地接入开放域排行榜_第7张图片

Egret微信小游戏怎么更方便地接入开放域排行榜_第8张图片

4.完成之后通过命令行egret publish把开放域工程导出到微信小游戏:

Egret微信小游戏怎么更方便地接入开放域排行榜_第9张图片

5.如图所示我们在主域的排行榜UI中嵌入了开放域的UI:

Egret微信小游戏怎么更方便地接入开放域排行榜_第10张图片

6.通过代码调用显示排行榜:

private async showRank(type) {
    if (this.objData == null) {
        if (window.platform.openDataContext) {
            var bitmap = window.platform.openDataContext.createDisplayObject(null, this.stage.stageWidth, this.stage.stageHeight);
            bitmap.pixelHitTest = true;
            this.addChild(bitmap);
        }

        SdkManager.instance.postMessage({
            command: "init"
        });
        
        //编码关键
        this.objData = {};
        var encoder: DisplayObjectEncoder = new DisplayObjectEncoder();
        encoder.encodeDisplayObject(this.openDataGroup, this.objData, true);
        console.log(this.objData);
    }

    var datas = null;
    //世界排行榜,先获取数据再发往开放域
    if (type == 1) {
        datas = await (DBManager.getSingtonInstance()).GetRankDatas();
    }
    this.GameState = EGameState.Rank;
    SdkManager.instance.postMessage({
        command: "show",
        objData: this.objData,
        datas: datas,
        rankKey: DBDataKey.RankCache
    });
}

7.开放域通过数据解码:

private onShow(objData, datas, page) {
    this.curObjData = objData;
    this.curDatas = datas;
    var length = objData.childs.length;
    if (page >= 0 && page < Math.ceil(datas.length / length)) {
        this.curPage = page;
    }
    else {
        page = this.curPage;
    }
    for (var i = 0; i < length; i++) {
        var index = page * length + i;
        if (index < datas.length) {
            if (index >= 0 && index < 3) {
                objData.childs[i].childs[1].url = "resource/assets/tcs/game/" + (i + 1) + ".png";
                objData.childs[i].childs[4].text = "";
            }
            else {
                objData.childs[i].childs[1].url = "";
                objData.childs[i].childs[4].text = index + 1;
            }
            objData.childs[i].childs[2].text = datas[index].scoreBest;
            objData.childs[i].childs[3].text = datas[index].nickName;
        }
        else {
            objData.childs[i].childs[1].url = "";
            objData.childs[i].childs[2].text = "";
            objData.childs[i].childs[3].text = "";
            objData.childs[i].childs[4].text = "";
        }
    }
    let decoder: DisplayObjectDecoder = new DisplayObjectDecoder(objData);
    decoder.decodeDisplayObject(objData, this);
}

8.导出工程,实际效果:

Egret微信小游戏怎么更方便地接入开放域排行榜_第11张图片

总结

本文的重点内容主要有以下几点,不知道小伙伴们是否已经理解:

  • 微信小游戏接入排行榜的重要意义。
  • 什么是开放域。
  • 如何接入开放域排行榜。
  • 怎么更方便地接入开放域排行榜。
  • 本文关键工程和源码关注"亿元程序员"发送"rank"获取。

本系列是《从零开始开发贪吃蛇小游戏到上线系列》,欢迎大家订阅。游戏已经上线,大家可以搜索小游戏《贪吃蛇掌机经典》进行体验。

此外笔者还有2款已经上线的小游戏《填色之旅》《重力迷宫球》大家也可以自行搜索体验。

感兴趣的小伙伴记得关注"亿元程序员"哦,学习小游戏开发不迷路。欢迎大家一起交流。

喜欢的可以点个、点个在看哦!谢谢大家。

本文由mdnice多平台发布

你可能感兴趣的:(小程序)