cocos開發(fā)微信小游戲集成好友群友排行榜

一、引言:為什么排行榜是小游戲的「社交核武器」?

微信小游戲集成好友排行榜/群友排行榜,能在玩家社交圈產(chǎn)生強(qiáng)力粘性:

  • 看到熟人玩得比你好 ?? 你會(huì)不會(huì)偷偷熬夜刷分?
  • 發(fā)現(xiàn)好友玩得比你菜 ?? 怎能忍住不截圖嘲諷?
  • 游戲熱度就像野火,在小圈子里瞬間點(diǎn)燃!
排行榜類型 社交場(chǎng)景 獨(dú)特優(yōu)勢(shì)
好友排行榜 熟人朋友圈 精準(zhǔn)激發(fā)攀比心理
群友排行榜 微信吹水群 突破好友限制,陌生人也能Battle!

?? 微信的「用戶域」安全機(jī)制
為防止好友數(shù)據(jù)濫用,微信設(shè)計(jì)了雙域隔離:

  • 主域:運(yùn)行游戲邏輯(可上傳成績(jī),不能讀取好友數(shù)據(jù))
  • 開放域(用戶域):專門處理排行榜(可讀取數(shù)據(jù),不能操作主域

?? 官方文檔:開放域能力說(shuō)明
?? 核心規(guī)則:主域Canvas無(wú)法渲染開放域內(nèi)容,必須通過(guò)專用通道交互!


二、前提準(zhǔn)備

確保滿足以下條件再上車:

  • cocos3.8.0開發(fā)小游戲,并集成發(fā)布到微信小游戲。
  • 微信公眾平臺(tái),備案,微信認(rèn)證等做完。
  • 默認(rèn)您已經(jīng)掌握了從cocos做了一些游戲內(nèi)容,點(diǎn)擊過(guò)構(gòu)建微信小游戲,并在微信小游戲開發(fā)工具中運(yùn)行過(guò)。

三、效果圖預(yù)覽

好友排行榜實(shí)戰(zhàn)效果

場(chǎng)景 效果圖
結(jié)算界面排行榜入口
image.png
排行榜詳情頁(yè)
image.png

群友排行榜實(shí)戰(zhàn)效果

場(chǎng)景 效果圖
分享到群邀請(qǐng)
image.png
雙榜單并列展示
image.png
群排行榜詳情
image.png

四、微信好友排行榜集成指南

?? 步驟一:生成開放域工程模板

  1. 打開構(gòu)建面板
    項(xiàng)目設(shè)置構(gòu)建發(fā)布 → 編輯微信小游戲構(gòu)建配置
    image.png
  1. 關(guān)鍵操作
    ? 勾選 生成開放數(shù)據(jù)域工程模板 → 點(diǎn)擊構(gòu)建
    image.png
  1. 生成目錄確認(rèn)
    構(gòu)建后查看:build/wechatgame/openDataContext
    image.png

?? 步驟二:上傳玩家分?jǐn)?shù)

在游戲結(jié)算邏輯中加入代碼:

if (typeof window['wx'] !== 'undefined') {
    const wx = window['wx'];
    const kvDataList = [];
    kvDataList.push({
        key: `你的分?jǐn)?shù)的key,隨便你取名,取的時(shí)候?qū)?yīng)著取就行`,
        value: '你的分?jǐn)?shù)的value'
    });
    wx.setUserCloudStorage({
        KVDataList: kvDataList,
        success: () => {
            console.log('成功上傳所有游戲分?jǐn)?shù)到微信開放域');
        },
        fail: (err) => {
            console.error('上傳游戲分?jǐn)?shù)到微信開放域失敗:', err);
        }
    });
}

?? 步驟三:讀取并渲染排行榜

openDataContext/index.js 中處理數(shù)據(jù):

const style = require('./render/style')
const template = require('./render/template')
const Layout = require('./engine').default;

let __env = GameGlobal.wx || GameGlobal.tt || GameGlobal.swan;
let sharedCanvas  = __env.getSharedCanvas();
let sharedContext = sharedCanvas.getContext('2d');

let friendsData = [];

function getFriendsData() {
    if (GameGlobal.wx) {
        let keyList = ['你的分?jǐn)?shù)key,與前面設(shè)置值的時(shí)候的key保持一致'];//可以是一個(gè)list
        wx.getFriendCloudStorage({
            keyList: keyList, 
            success: res => {
                setDataRandRender(res)
            },
            fail: err => {
                console.error('獲取好友數(shù)據(jù)失敗:', err);
            }
        });
        
    }
}

function setDataRandRender( res) {
    console.log('獲取好友數(shù)據(jù)成功:', res.data);
    // 處理好友數(shù)據(jù)
    friendsData = res.data.map(friend => ({
        avatarUrl: friend.avatarUrl,
        nickname: friend.nickname,
        rankScore: friend.KVDataList.find(data => data.key === (gameName + 'Score'))?.value || '0'
    }));

    // 按分?jǐn)?shù)排序(從高到低)
     friendsData.sort((a, b) => parseFloat(a.rankScore) - parseFloat(b.rankScore));
    
    // 重新渲染排行榜
    draw({data: friendsData});
}

function draw(dataList) {
    Layout.clear();
    Layout.init(template(dataList), style);
    Layout.layout(sharedContext);
}

function updateViewPort(data) { 
    Layout.updateViewPort({
        x: data.x,
        y: data.y,
        width: data.width,
        height: data.height,
    });
}

__env.onMessage(data => {
    console.log(data);
    if ( data.type === 'engine' && data.event === 'viewport' ) {
        updateViewPort(data);
    }else {
        // 當(dāng)需要更新排行榜時(shí)獲取好友數(shù)據(jù)
        getFriendsData(data.type,data.rankType);
    }
});


五、群友排行榜集成指南

?? 重要聲明:

  1. 步驟一/二與第四章完全相同(已操作可跳過(guò))

  2. 步驟三僅需替換一個(gè)API

getFriendsData中的wx.getFriendCloudStorage換成wx.getGroupCloudStorage

?? 血淚教訓(xùn)
群數(shù)據(jù)獲取必須通過(guò)分享卡片進(jìn)入!直接打開游戲會(huì)獲取失?。?br> 相當(dāng)于進(jìn)群需要「邀請(qǐng)函」(shareTicket),硬闖會(huì)被微信保安丟出去!


六、自定義排行榜樣式

打開關(guān)鍵文件進(jìn)行深度美顏,想要什么界面效果自己去改:

openDataContext/
  └── render/
        └── template.js  // 排行榜UI核心文件

七、效果體驗(yàn) & 反饋

?? 實(shí)機(jī)體驗(yàn)

搜:游戲玩家天賦檢測(cè)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容