4

在 Apple 的游戏中心 api 方面,我将如何请求并取回特定排行榜和时间范围的本地用户时间和排名?

  • 对于排行榜 X(即指定棋盘 - 例如 Level12_BestTime),对于给定的 TimeScope
  • 返回本地玩家当前:a)时间,例如 12.3 秒 b)排名(与朋友)例如第 12 位 c)排名(所有玩家)例如第 123 位
4

2 回答 2

2

游戏中心编程指南复制:

GKLeaderboard *leaderboardRequest = [[GKLeaderboard alloc] init];
if (leaderboardRequest != nil)
{
    leaderboardRequest.playerScope = GKLeaderboardPlayerScopeGlobal; // or GKLeaderboardPlayerScopeFriendsOnly
    leaderboardRequest.timeScope = GKLeaderboardTimeScopeToday; // or GKLeaderboardTimeScopeWeek, GKLeaderboardTimeScopeAllTime
    leaderboardRequest.identifier = @"Combined.LandMaps" // Name of the leaderboard
    leaderboardRequest.range = NSMakeRange(1,10); // How many results to get
    [leaderboardRequest loadScoresWithCompletionHandler: ^(NSArray *scores, NSError *error) {
        if (error != nil)
        {
            // Handle the error.
        }
        if (scores != nil)
        {
            // Process the score information.
        }
        }];
}

要获取特定用户的信息:

 GKLeaderboard *leaderboardRequest = [[GKLeaderboard alloc] initWithPlayerIDs: match.playerIDs];

在这两种情况下,用户的分数都存储在localPlayerScore中,所有分数都存储在score中。

然而,排名可能有问题。您最多只能获得 100 分,因此如果排行榜非常大,可能需要很多电话。localPlayerScore确实包含一个排名值,但这仅与当前分数列表相关。基本上,您必须遍历整个排行榜才能找到用户的位置。

于 2013-11-04T15:15:27.780 回答
2

关于您问题的第二部分, GKScore 的 rank 属性应该可以解决问题。根据我的测试,它会根据指定的加载排行榜分数的标准报告玩家的排名,即使玩家的分数超出了请求的范围。请参阅下面的示例:

GKLeaderboard *board = [[GKLeaderboard alloc] init];
pbBoard.timeScope = GKLeaderboardTimeScopeAllTime;
pbBoard.range = NSMakeRange(1, 1);
pbBoard.identifier = @"myleaderboard";
[pbBoard loadScoresWithCompletionHandler: ^(NSArray *scores, NSError *error) {
    if (error != nil) {
        // handle the error.
    }
    if (scores != nil) {
        GKScore* score = [board localPlayerScore];
        NSInteger rank = score.rank;
        // do whatever you need with the rank
    }
}];
于 2014-06-19T00:05:29.620 回答