乐于分享
好东西不私藏

微信小游戏排行榜有多难写?看完这份源码你就懂了

微信小游戏排行榜有多难写?看完这份源码你就懂了


    玩过《魔卡塔防》的朋友都知道,微信小游戏里那个好友排行榜简直是社交裂变的灵魂——看着好友名次比自己高,恨不得再肝十局。但作为开发者,当你兴冲冲准备撸一个排行榜时,微信甩给你一个神秘概念:开放数据域。

    今天,我直接把自己的生产环境源码拆开揉碎,一步步带你实现一个可切换击杀榜/防御塔榜、带高亮自己排名的完整排行榜。

💡

PART.01
整体流程

 主域点击“排行榜”按钮 → 发消息给开放域 → 开放域拉取好友数据 + 自己信息 → 排序 → 用 Layout 引擎渲染 → 显示在主域的 sharedCanvas 上。

 1. 最终效果预览
2. 源码目录
openDataContext/├── index.js          # 主逻辑(本文代码)├── render/│   ├── style.js      # 布局样式定义│   └── template.js   # XML模板
PART.02
index.js关键代码拆解
1. 监听主域消息,启动数据拉取
wx.onMessage((data) => {    switch (data.command) {        case 'killsBtn_click':  // 点击击杀榜        case 'towerBtn_click':  // 点击塔榜        case 'load_frend_data'// 初次加载            getFrendData(data);            break;    }});
注意事项: 主域只需要发一个 { command: ‘killsBtn_click’ } 过来,开放域就开始干活。
2. 获取“我自己” + 好友数据(大坑预警⚠️)
很多教程只写wx.getFriendCloudStorage,但这玩意不返回你自己的数据!你会在排行榜里找不到自己。正确做法:
wx.getUserInfo({    openIdList: ['selfOpenId'], // 魔法字符串,专拿自己    success(res) => {        const myInfo = res.data[0];        // 再拉取好友数据,并用昵称+头像匹配标记 isSelf        wx.getFriendCloudStorage({            keyList: ['kills','towers','victoryNum'], // 托管数据key            success(friendRes) => {                // 遍历标记自己,并解析 KVDataList            }        });    }});
避坑点:
  • openIdList: [‘selfOpenId’] 是固定写法,不是变量。
  • 好友数据中的 KVDataList 是存储游戏自定义数值的地方,需要手动解析。
3. 解析 KVDataList 并填充默认值
因为好友可能没玩过游戏,KVDataList 为空,必须补默认值:
friendList.forEach(item => {    // 先给默认值    const demoKeArr = [{"key":"kills","value":"0"},{"key":"towers","value":"0"},{"key":"victoryNum","value":"0"},{"key":"maxLevel","value":"0"},{"key":"grade","value":"1"}]    demoKeArr.forEach(openitem =>{         const keyName = openitem.key;         const keyValue = openitem.value;         item[keyName] = keyValue;    })    // 再用实际数据覆盖    if (item.KVDataList) {        item.KVDataList.forEach(kv => {            item[kv.key] = kv.value;        });    }});
4. 用 Layout 引擎渲染(告别手动画布)
微信官方提供了 Layout 引擎(像写 HTML+CSS 一样画 UI),比纯 canvas.fillText 舒服一万倍。
const Layout = requirePlugin('Layout').default;Layout.init(template(rankData), style);Layout.layout(sharedContext);
模板文件 (template.js) 用 XML 结构定义排行榜元素,样式文件 (style.js) 写类似 CSS 的样式,支持 backgroundColor、fontSize 等。
PART.03
完整源码获取
🎮 想亲眼看看这个排行榜长什么样吗?
微信搜一搜 【魔卡塔防】,直接进游戏点开排行榜——击杀榜、塔防榜一键切换,你自己的头像正带着光环稳坐前列。源码里那些 preKills 差值提示,在游戏里就变成了“再击败 XX 即可超越”的实时动力。别光看代码,上手玩一局才叫过瘾!
注意:想要获取完整代码的同学,请私信 ,后续会挨个下发完整代码
PART.04
总结
用开放数据域做排行榜,核心就三步:
  1. 主域发指令 → 开放域监听
  2. 开放域拉取好友数据(记得先拿自己) → 排序加工
  3. 用 Layout 引擎渲染 → 主域显示 sharedCanvas
掌握这套流程,无论是击杀榜、通关榜还是段位榜,都能轻松切换。而且微信 Layout 引擎支持 flex 布局,写起来跟做网页一样顺滑。
最后提醒: 一定要在游戏里主动调用 wx.setUserCloudStorage 上传玩家数据,否则好友永远看不到你的分数。 
—— END ——
点击上方名片关注公众号,获取更多干货!
🚀嘿,如果你也觉得这篇文章对你有帮助
不妨点个关注
   未来路上,我们想陪你走得更远
   你的每个 “在看”和 “关注”
👇都是我们持续创作的动力