成绩上报与排行榜

本章所列接口均需依赖手Q环境,测试工程无法正常返回值

QQ轻游戏平台提供成绩上报与排行榜接口,用于游戏内成绩的上报与排行。

开发者通过使用上报接口进行数据上报后,通过排行榜接口进行成绩的拉取,与展示。

接口说明

现QQ轻游戏平台有新旧两套上报、排行榜系统。

成绩上报与排行榜(新)

开发者可自定义成绩的支持以下特性:

  • 排序方式 (从大到小、从小到大)
  • 排行榜更新周期默认为一周 (即:每周日0:00进行排行榜清空操作。并支持每月一清,永久不清,具体可以到hudong管理端配置,
  • 必须配置好周期规则后,才能使用数据上报和排行榜功能
    使用自建后台的游戏使用本接口进行成绩上报。

本接口支持两种特性

  • 支持多榜单同时上报

    对应例子代码中scoreInfo中score字段为默认榜单,a1,a2,aN等字段为开发者可自定义榜单

  • 支持多榜单排序方式

对应data.attr中的字段 1: 从大到小 2: 从小到大 3: 累积 4: 直接覆盖 四种排序方式。例如执行 a1排行榜为 从小到大的排序方式,可以设置为 a1: { type: 'rank', order: 2, }

  1. var data = {
  2. userData: [
  3. {
  4. openId: GameStatusInfo.openId,
  5. startMs: this.start_game_time.toString(), //必填。 游戏开始时间。单位为毫秒,<font color=#ff0000>类型必须是字符串</font>
  6. endMs: ((new Date()).getTime()).toString(), //必填。 游戏结束时间。单位为毫秒,<font color=#ff0000>类型必须是字符串</font>
  7. scoreInfo: {
  8. score: 100, //分数,类型必须是整型数
  9. // 附加属性(选填),最多 16 个,名称必须为a1 ~ a16,,类型必须是整型数.
  10. a1: 100,
  11. ...
  12. a16: 100,
  13. },
  14. },
  15. ],
  16. // type 描述附加属性的用途
  17. // order 排序的方式,
  18. // 1: 从大到小,即每次上报的分数都会与本周期的最高得分比较,如果大于最高得分则覆盖,否则忽略
  19. // 2: 从小到大,即每次上报的分数都会与本周期的最低得分比较,如果低于最低得分则覆盖,否则忽略(比如酷跑类游戏的耗时,时间越短越好)
  20. // 3: 累积,即每次上报的积分都会累积到本周期已上报过的积分上
  21. // 4: 直接覆盖,每次上报的积分都会将本周期的得分覆盖,不管大小
  22. // 如score字段对应,上个属性.
  23. attr: {
  24. score: {
  25. type: 'rank',
  26. order: 1,
  27. },
  28. a1: {
  29. type: 'rank',
  30. order: 2,
  31. }
  32. },
  33. };
  34. // gameMode: 游戏模式,如果没有模式区分,直接填 1
  35. // 必须配置好周期规则后,才能使用数据上报和排行榜功能
  36. BK.QQ.uploadScoreWithoutRoom(gameMode, data, function(errCode, cmd, data) {
  37. // 返回错误码信息
  38. if (errCode !== 0) {
  39. BK.Script.log(1,1,'上传分数失败!错误码:' + errCode);
  40. }
  41. });

错误码

错误码

拉取排行榜

使用排行榜数据的拉取,展示的样式交由开发者自定设计,QQ轻游戏平台不做要求。

排行榜数据提供 昵称头像url积分 三种数据。此处不提供openId与昵称、头像的对应关系

  1. // 当前不支持一次同时拉取多个排行榜,需要拉取多次,而且必须等上一个拉取回来后才能拉取另外一个排行榜
  2. // 先拉 score 排行榜
  3. var attr = "score";//使用哪一种上报数据做排行,可传入score,a1,a2等
  4. var order = 1; //排序的方法:[ 1: 从大到小(单局),2: 从小到大(单局),3: 由大到小(累积)]
  5. var rankType = 0; //要查询的排行榜类型,0: 好友排行榜,1: 群排行榜,2: 讨论组排行榜,3: C2C二人转 (手Q 7.6.0以上支持)
  6. // 必须配置好周期规则后,才能使用数据上报和排行榜功能
  7. BK.QQ.getRankListWithoutRoom(attr, order, rankType, function(errCode, cmd, data) {
  8. BK.Script.log(1,1,"getRankListWithoutRoom callback cmd" + cmd + " errCode:" + errCode + " data:" + JSON.stringify(data));
  9. // 返回错误码信息
  10. if (errCode !== 0) {
  11. BK.Script.log(1,1,'获取排行榜数据失败!错误码:' + errCode);
  12. return;
  13. }
  14. // 解析数据
  15. if (data) {
  16. for(var i=0; i < data.data.ranking_list.length; ++i) {
  17. var rd = data.data.ranking_list[i];
  18. // rd 的字段如下:
  19. //var rd = {
  20. // url: '', // 头像的 url
  21. // nick: '', // 昵称
  22. // score: 1, // 分数
  23. // selfFlag: false, // 是否是自己
  24. //};
  25. }
  26. }
  27. // 再拉 a1 的排行榜
  28. BK.QQ.getRankListWithoutRoom('a1', 1, rankType, function(errCode, cmd, data) {
  29. BK.Script.log(1,1,"getRankListWithoutRoom callback cmd" + cmd + " errCode:" + errCode + " data:" + JSON.stringify(data));
  30. // 返回错误码信息
  31. if (errCode !== 0) {
  32. BK.Script.log(1,1,'获取排行榜数据失败!错误码:' + errCode);
  33. return;
  34. }
  35. // 解析数据
  36. if (data) {
  37. for(var i=0; i < data.data.ranking_list.length; ++i) {
  38. var rd = data.data.ranking_list[i];
  39. /// rd 的字段如下:
  40. //var rd = {
  41. // url: '', // 头像的 url
  42. // nick: '', // 昵称
  43. // a1: 1, // 分数
  44. // selfFlag: false, // 是否是自己
  45. //};
  46. }
  47. }
  48. });
  49. });

例子:下面为引力球使用本接口进行排行榜展示的例子

 4.1.数据上报与排行榜  - 图1

错误码

错误码

1.1 QQ轻游戏后台成绩上报

使用QQ轻游戏后台,指使用BK.Room接口进行房间的创建、加入、退出房间等操作。上报的成绩与房间id(roomId)强相关。

  • 游戏正常结束

  • 玩家中途退出

两种情况均需要将成绩上报至QQ轻游戏后台。需要注意的是无论正常退出还是中途退出,都需要将当局游戏内所有的人的成绩都进行上报。

例ABCD,四人参加游戏,A中途退出,A需将ABCD四人成绩一律上传。如是单人游戏,也需要将单人成绩上传。

正常退出:正常上报所有人成绩

中途退出:将所有人成绩填0上报

此处需要特别注意的是,游戏使用QQ轻游戏后台与使用自建后台,引擎侧使用的上报接口不一致

为防止游戏数据造假,开发进行游戏成绩上报时,需上报游戏内所有人的游戏成绩。

请求:

  1. //具体的得分数据数组。数组中每个元素为一个用户的得分
  2. var data = [
  3. {
  4. //第一个用户的得分
  5. "openId":"4558665DATRGFGFS455",
  6. "scoreInfo":{
  7. "score":4455, //用户得分,<font color=#ff0000>必须上报,类型必须是整型数</font>
  8. //附加参数,上报和使用都由第三方决定,最多支持5个附加参数,可选,<font color=#ff0000>类型必须是整型数</font>
  9. "a1":1,
  10. "a2":2,
  11. },
  12. "actInfo":{ //活动数据由第三方配置定义,key值统一用p1,p2,...此数据只用于活动,不会保存到用户的房间数据里, 现支持最多支持16个
  13. "p1":1, //参数0
  14.    "p2":5, //参数1
  15. },
  16. },
  17. {
  18. //第二个用户的得分
  19. "openId":"SDJIIWJIEQWJ232389DA",
  20. "scoreInfo":{
  21. "score":4455, //用户得分,<font color=#ff0000>必须上报,类型必须是整型数</font>
  22. //附加参数,上报和使用都由第三方决定,最多支持5个附加参数,可选,<font color=#ff0000>类型必须是整型数</font>
  23. "a1":1,
  24. "a2":2,
  25. },
  26. "actInfo":{
  27. //活动数据由第三方配置定义,key值统一用p1,p2,...此数据只用于活动,不会保存到用户的房间数据里, 现支持最多支持16个
  28. "p1":1, //参数0
  29. "p2":5, //参数1
  30. },
  31. //第n个用户的得分 ...
  32. }]
  33. BK.QQ.scoreUpload(data,function(err,cmd,data){
  34. //errCode ,0表示成功其他为异常
  35. //data = {}
  36. });

1.2 QQ轻游戏后台拉取排行榜

  1. BK.QQ.getRankList(function (errCode, cmd, data) {
  2. BK.Script.log(1, 1, "getRankList demo callback cmd" + cmd + " errCode:" + errCode + " data:" + JSON.stringify(data));
  3. if(data)
  4. {
  5. var rankList = data.data.rankList;
  6. for(var i=0;i<rankList.length;i++){
  7. var rankNode = rankList[i];
  8. BK.Script.log(1, 1, "rankList i:" + i +
  9. " nick:" + rankNode.nick + //昵称
  10. " head:" + rankNode.head + //头像url
  11. " accPoint:"+rankNode.busData.accPoint) //积分
  12. }
  13. }
  14. });

1.3.获取房间内的用户成绩数据

请求:

  1. var data = {
  2. "from" : "xxxxx", //描述请求来源或场景 h5.xxx.yyy/ios.xxx.yyy/android.xxx.yyy 用于后台统计
  3. "gameId":1, //游戏ID
  4.    "version":"2.0", //游戏版本
  5. "roomId": 123, //房间ID
  6. };
  7. BK.QQ.getRoomUserScoreInfo(data,function(errCode,cmd,data){
  8. if(data.data){
  9. var userRank = data.data.userRank;
  10. for (var idx = 0; idx < userRank.length; idx++) {
  11. var singleUserRank = userRank[idx];
  12. var openId = singleUserRank.openId;
  13. var score = singleUserRank.score;
  14. var rank = singleUserRank.rank;
  15. //可选
  16. // var a1 = singleUserRank.a1;
  17. // var a2 = singleUserRank.a2;
  18. // ...
  19. //
  20. }
  21. }
  22. });

回包

  1. errCode 0表示成功其他为异常
  2. data =
  3. {
  4. "data": {
  5. "userRank": [
  6. {
  7. "openId":"100001",
  8. "score":560,
  9. "rank":1,
  10. "a1":123,
  11. ...
  12. "a5":123,
  13. }
  14. ...
  15. ]
  16. }
  17. }

1.3.查询某个用户在一款游戏中的积分

请求:

  1. var data = {
  2. "from" : "xxxxx", //描述###请求来源或场景 h5.xxx.yyy/ios.xxx.yyy/android.xxx.yyy 用于后台统计
  3. "gameId":1, //游戏ID
  4.    "toOpenId":"123", //需要查询的openId(如果是查自己的数据,则不用传, 注意此参数仅在游戏当天有用)
  5.    "version":"2.0", //游戏版本
  6. "cycleNum":0 //周期序号 【0-本周期, 1-上一周期, 2-上两周期】 目前后台会保存三个周期的游戏数据,例如若一个周期为1星期,则0代表本星期的数据。
  7. };
  8. BK.QQ.getUserGameinfo(data,function(err,cmd,data){
  9. //回包数据
  10. });

回包数据

  1. errCode 0表示成功其他为异常
  2. data = {
  3. "data": {
  4. "toOpenId":"12345556645DAGADFGAD" //###请求有传入toOpenId则有返回,没传入则无此字段返回
  5. "myPoint":800 //用户积分
  6. }
  7. }

原文: https://hudong.qq.com/docs/engine/userInfo/rank.html