引言
微信小游戏接入排行榜可以激发玩家竞争欲望,增加游戏的互动性和挑战性,提高用户的黏性和留存率。同时,排行榜还可以帮助玩家比较自己在游戏中的成绩,增加游戏的社交性和乐趣。那么我们要如何接入开放域排行榜呢?我们先引入一个开放域的概念。本章源码和开放域工程会放在文章末尾,大家有需要的可以自行去获取。
微信小游戏的开放域
微信小游戏的开放域是指通过开放数据域(OpenData)实现的一种功能,它允许小游戏在小程序环境中与其他小游戏共享一部分数据。开发者可以在开放数据域中绘制UI界面、展示排行榜、分享成绩等,并将这些信息展示在小程序的游戏界面上。开放域的数据不会与用户的个人信息相关联,保护用户隐私。开放域为小游戏提供了互动和社交功能,增强了用户体验和游戏的社区性质。
开放域的特点总结如下:
限制操作:开放域环境下,用户无法进行除了点击和触摸以外的操作,以防止用户通过开放域环境进行恶意操作和作弊。
无网络访问:开放域环境无法直接访问网络,无法获取用户个人信息和敏感数据,确保用户的隐私安全。
共享数据:开放域可以通过发送消息和接收消息的方式与主游戏进行通信,实现共享数据和信息。
自定义UI:开放域可以自定义绘制UI界面,包括按钮、文本框等,提供给用户更多的交互方式。
多人联机:开放域可以支持多人联机游戏,用户可以与其他玩家进行实时互动和竞技。
总的来说就是,想要获取到玩家的好友并展现给玩家看,就必须要在开放域进行操作,开放域的数据无法传到外界,极大限度地保护了玩家地隐私。
如何接入排行榜
1.将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.调用之后我们可以看到一个简单的排行榜
7.然后我们通过修改index.js这个文件内容,可以把排行榜修改成我们想要的样式即可。
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开放域工程。
我们将其命名为开放域工程,大家可以自己导出,也可以在文末获取之后直接修改使用。
2.如果大家自己导出记得要复制或者配置下图中红框的几个文件:
3.大家可以直接在开放域工程编写UI,笔者写了个插件可以直接在主游戏工程编辑UI,然后通过指令发送到开放域。主要通过UI编码和解码器实现:
4.完成之后通过命令行egret publish把开放域工程导出到微信小游戏:
5.如图所示我们在主域的排行榜UI中嵌入了开放域的UI:
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>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.导出工程,实际效果:
总结
本文的重点内容主要有以下几点,不知道小伙伴们是否已经理解:
微信小游戏接入排行榜的重要意义。
什么是开放域。
如何接入开放域排行榜。
怎么更方便地接入开放域排行榜。
本文关键工程和源码关注"亿元程序员"发送"rank"获取。
本系列是《从零开始开发贪吃蛇小游戏到上线系列》,欢迎大家订阅。游戏已经上线,大家可以搜索小游戏《贪吃蛇掌机经典》进行体验。
此外笔者还有2款已经上线的小游戏《填色之旅》《重力迷宫球》大家也可以自行搜索体验。
感兴趣的小伙伴记得关注"亿元程序员"哦,学习小游戏开发不迷路。欢迎大家一起交流。
喜欢的可以点个赞、点个在看哦!谢谢大家。
点击微信公众号 关注我们