Как получить рейтинг лидеров аутентифицированного игрока (Game Center) - PullRequest
7 голосов
/ 09 июня 2011

Мне нужно получить счет игрока, прошедшего аутентификацию, из Game Center. Я использую этот код, чтобы получить счет, но он просто получает максимальный результат (лучший результат в таблице лидеров, а не счет указанного игрока). Как я могу получить счет игрока, прошедшего проверку?

- (void) retrievePlayersScore {
    GKLeaderboard *leaderboardRequest = [[GKLeaderboard alloc] init]; 
    if (leaderboardRequest != nil) {
        leaderboardRequest.playerScope = GKLeaderboardPlayerScopeGlobal; 
        leaderboardRequest.timeScope = GKLeaderboardTimeScopeAllTime; 
        leaderboardRequest.range = NSMakeRange(1,1);
        [leaderboardRequest loadScoresWithCompletionHandler: ^(NSArray *scores, NSError *error) {
            if (error != nil) {
                // handle the error. if (scores != nil)
            }
            if (scores != nil){
                // process the score information.
                CCLOG(@"My Score: %d", ((GKScore*)[scores objectAtIndex:0]).value);
            } 
        }];
    }
}

Ответы [ 4 ]

10 голосов
/ 17 июня 2011

Вы можете использовать следующий код:

GKLeaderboard *leaderboardRequest = [[GKLeaderboard alloc] init];

leaderboardRequest.identifier = _leaderboardIdentifier;

if (leaderboardRequest != nil) {
    [leaderboardRequest loadScoresWithCompletionHandler:^(NSArray *scores, NSError *error){
        if (error != nil) {
            //Handle error
        }
        else{
            [delegate onLocalPlayerScoreReceived:leaderboardRequest.localPlayerScore];
        }
    }];
}
6 голосов
/ 27 октября 2013

Вам просто нужно нажать loadScoresWithCompletionHandler для данного GKLeaderboard, тогда автоматически для этой доски будет заполнено board.localPlayerScore.

Так, например,

- (void) getLoadLeaderboardPositions
{
  [GKLeaderboard loadLeaderboardsWithCompletionHandler:^(NSArray *leaderboards, NSError *nsError) {
    if( nsError != nil )
    {
      error( nsError, "get leaderboard score" ) ;
      return ;
    }

    for( GKLeaderboard* board in leaderboards )
    {
      // fetch score for minimum amt of data, b/c must call `loadScore..` to get MY score.
      board.playerScope = GKLeaderboardPlayerScopeFriendsOnly ;
      board.timeScope = GKLeaderboardTimeScopeAllTime ;

      NSRange range = {.location = 1, .length = 1};
      board.range = range ;

      [board loadScoresWithCompletionHandler:^(NSArray *scores, NSError *error) {
        printf( "YOUR SCORE ON BOARD %s WAS %lld\n", [board.title UTF8String], board.localPlayerScore.value ) ;
      }] ;
    }
  }] ;
}
5 голосов
/ 16 декабря 2011

Вы также можете попытаться создать таблицу лидеров, используя массив идентификаторов игроков, чтобы сузить количество игроков:

GKLeaderboard *board = [[[GKLeaderboard alloc] initWithPlayerIDs:[NSArray arrayWithObject:myGCPlayerID]] autorelease];
1 голос
/ 21 ноября 2017

Обновленная версия с использованием Swift

let localPlayer = GKLocalPlayer.localPlayer()

if localPlayer.isAuthenticated {
    let leaderboard = GKLeaderboard(players: [localPlayer])
    leaderboard.identifier = LEADERBOARD_ID
    leaderboard.timeScope = .allTime
    leaderboard.loadScores(completionHandler: {
        (scores, error) in

        let bestScore = scores?.first?.value

        if bestScore != nil {
            // Do something with bestScore
        }
    })
}
...