QQ玩一玩好友排行榜與世界排行榜

QQ玩一玩好友排行榜與世界排行榜

1、開發環境

  • CocosCreator V2.0.5

  • 手Q版本 V7.9.0.3820(目前市場中最新版本)

  • qqPlayCore.js buildTime:'Fri Nov 09 2018 13:20:45 GMT+0800 (GMT+08:00)'上出現,此版本的qqPlayCore.js也是最新能正常使用的版本。

2、常見問題

  • 如何實現好友排行榜
  • 如何實現世界排行榜
  • 如何上報玩家成績
  • 如何獲取用戶圖像
  • 在CocosCreator中如何加載用戶的圖像

3、實現好友排行榜

QQ輕遊戲平臺提供成績上報與排行榜接口,用於遊戲內成績的上報與排行。

開發者通過使用上報接口進行數據上報後,通過排行榜接口進行成績的拉取與展示。

3.1 錯誤碼列表

排行榜/雲端存儲錯誤碼

3.2 支持兩種特性
  • 支持多榜單同時上報

    scoreInfo中score字段爲默認榜單,a1,a2,……,a16爲開發者可使用的 榜單key字段,不允許使用其他key

    目前最多支持16個榜單scoreInfo中的key字段值類型必須是整型數

  • 支持多榜單排序方式

    對應data.attr中的字段

    1: 從大到小,即每次上報的分數都會與本週期的最高得分比較,如果大於最高得分則覆蓋,否則忽略

    2: 從小到大,即每次上報的分數都會與本週期的最低得分比較,如果低於最低得分則覆蓋,否則忽略

    比如酷跑類遊戲的耗時,時間越短越好

    3: 累積,即每次上報的積分都會累積到本週期已上報過的積分上(本質上是從大到小的一種特例)

    4: 直接覆蓋,每次上報的積分都會將本週期的得分覆蓋,不管大小

3.3 成績數據上報
/**
 * 成績上報
 * @param {*} level 
 * @param {*} callback 
 */
function uploadScore(level, callback) {
    if (cc.sys.platform != cc.sys.QQ_PLAY) {
        if (callback) {
            callback(-1, "此接口只支持QQ玩一玩平臺");
        }
        return;
    }

    var data = {
        userData: [{
            openId: GameStatusInfo.openId,
            startMs: Global.startGameTime,
            endMs: ((new Date()).getTime()).toString(),
            scoreInfo: {
                score: level,//分數,類型必須是整型數
                // 多榜單附加屬性(選填),最多16個,且名稱必須爲a1 ~ a16,類型必須是整型數
                //a1: 100,
                //...
                //a16: 100
            },
        }, ],
        // type 描述附加屬性的用途
        // order 排序的方式,
        // 1: 從大到小,即每次上報的分數都會與本週期的最高得分比較,如果大於最高得分則覆蓋,否則忽略
        // 2: 從小到大,即每次上報的分數都會與本週期的最低得分比較,如果低於最低得分則覆蓋,否則忽略
        // 3: 累積,即每次上報的積分都會累積到本週期已上報過的積分上(本質上是從大到小的一種特例)
        // 4: 直接覆蓋,每次上報的積分都會將本週期的得分覆蓋,不管大小
        // 如score字段對應,上個屬性.
        attr: {
            score: {
                type: 'rank',
                order: 1,
            }
            //如果要支持多榜單在此添加 a1~a16
            //a1: {
            //    type: 'rank',
            //    order: 2,
            //}
        },
    };
    // gameMode: 遊戲模式 1:普通,2:挑戰,如果沒有模式區分,直接填1 
    // 必須配置好週期規則後,才能使用數據上報和排行榜功能
    BK.QQ.uploadScoreWithoutRoom(1, data, function (errCode, cmd, data) {
        log("uploadScoreWithoutRoom callback  cmd" + cmd + " errCode:" + errCode + "  data:" + JSON.stringify(data));
        if (callback) {
            callback(errCode, data);
        }
    });
}
3.4 何時上報玩家成績

建議在以下兩個時間點上報玩家成績

  • 當局遊戲結束時
  • 退出遊戲時

當局遊戲結束時需要開發者主動調用上報操作,退出遊戲時上報需要監聽QQ玩一玩生命週期來實現,參考示例如下。

 _gameCloseListener() {

        //上報操作
        let score = Utils.getRandomInt(0, 100);
        BKTools.log('關閉遊戲:' + score);
        BKTools.uploadScore(score, function (errorCode) {
            if (errorCode == 0) {
                BKTools.log("數據上報成功......");
            } else {
                BKTools.log("數據上報失敗......");
            }
        });
    },

QQ玩一玩生命週期監聽具體實現邏輯參考之前寫的博客 QQ玩一玩廣告與音效使用總結

3.5 拉取排行榜數據

排行榜數據提供 暱稱頭像url積分 三種數據。此接口不提供openId與暱稱、頭像的對應關係

圖像URL參考:http://thirdqq.qlogo.cn/g?b=sdk&k=OiaMLzXmbEwq5trqsR6zd1A&s=100&t=1483310911

如果要獲取多榜單數據可以多次調用此接口,只是 attr、order 這兩個參數需要根據實際排行榜需求設置不同的值,rankType 目前爲固定值0(好友排行榜)

/**
 * 拉取排行榜數據
 * @param {*} callback 
 */
function getRankList(callback,attr,order) {
    if (cc.sys.platform != cc.sys.QQ_PLAY) {
        if (callback) {
            callback(-1, "此接口只支持QQ玩一玩平臺");
        }
        return;
    }
    if(!attr){
       attr = "score";//使用哪一種上報數據做排行,可傳入score,a1,a2等
    }
    if(!order){
       order = 1;//排序的方法:[ 1: 從大到小(單局),2: 從小到大(單局),3: 由大到小(累積)]
    }
    let rankType = 0;//要查詢的排行榜類型,0: 好友排行榜 目前是固定值
    BK.QQ.getRankListWithoutRoom(attr, order, rankType, function (errCode, cmd, data) {
        log("getRankListWithoutRoom callback  cmd" + cmd + " errCode:" + errCode);
        if (errCode != 0) {
            callback(errCode);
            return;
        }
        if (data) {
            let rankList = data.data.ranking_list;
            log("data not null " + rankList.length);
            log(JSON.stringify(data));
            // rankList.forEach(element => {
            //   log("....華麗的分割線....");
            //   log("score:" + element.score);
            //   log("nick:" + element.nick);
            //   log("....華麗的分割線....");
            // });
            if (callback) {
                callback(errCode, rankList);
            }
        }
    });
}
3.6 拉取排行榜使用示例
BKTools.getRankList(function (errorCode, rankList) {
    if (errorCode == 0) {
        if (rankList && rankList.length > 0) {
            rankList.forEach(element => {
                BKTools.log("item:" + JSON.stringify(element));
            });
        } else {
            BKTools.log("....排行榜爲空....");
        }
    } else {
        BKTools.log("....獲取排行榜失敗....");
    }
}.bind(this));
3.7 好友排行榜圖像顯示
Utils.loadImgByUrl(this.image, "http://thirdqq.qlogo.cn/g?b=sdk&k=OiaMLzXmbEwq5trqsR6zd1A&s=100&t=1483310911");

具體實現可以參考之前寫的博客 QQ 玩一玩獲取用戶圖像暱稱以及CocosCreator動態加載網絡圖片

4、實現世界排行榜

實現世界排行榜就需要後臺的支持了,簡單的介紹一下實現邏輯

  • 玩家打開遊戲時通過全局參數獲取到openId
  • 通過openId獲取用戶的暱稱
  • 將openId以及用戶信息關聯上報後臺
  • 遊戲結束時調用後臺接口上報成績
  • 獲取世界排行榜就可以通過後臺提供的接口來查詢到所有玩家的openId、暱稱等(全局參數能獲取到的數據都能作爲排行榜排序的依據)
  • 獲取圖像可以使用 BK.MQQ.Account.getHeadEx(openID,callback) 此接口會獲取頭像並寫到本地目錄

全局參考獲取可以參考 QQ玩一玩廣告與音效使用總結

獲取用戶圖像並顯示可以參考 QQ 玩一玩獲取用戶圖像暱稱以及CocosCreator動態加載網絡圖片

5、相關參考資料

CocosCreator開發小遊戲示例:Brickengine_Guide

  • QQPlay爲舊版本QQ玩一玩示例
  • QQPlay_New爲新版本QQ玩一玩示例

官方文檔 關係鏈與用戶信息

官方文檔 成績上報與排行榜

官方文檔 排行榜/雲端存儲錯誤碼

到這裏就介紹完了,個人能力有限如有錯誤歡迎指正,如有遺漏歡迎補充。如有疑問歡迎留言一起交流討論。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章