【问题标题】:How to get authenticated player's high score form leaderboard ( Game Center )如何获得认证玩家的高分表格排行榜(游戏中心)
【发布时间】:2017-11-21 06:34:39
【问题描述】:

我需要从 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);
            } 
        }];
    }
}

【问题讨论】:

  • 通过大量搜索,我认为它没有办法做到这一点..

标签: iphone ios game-center


【解决方案1】:

您可以使用以下代码:

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];
        }
    }];
}

【讨论】:

  • 调用该委托方法的接口是什么?
  • 请注意:我们必须在调用 loadScores 之前设置 leaderboardRequest.identifier = @"myleaderboardidentifier";...
【解决方案2】:

您只需为给定的GKLeaderboardloadScoresWithCompletionHandler,然后会自动为该板填写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 ) ;
      }] ;
    }
  }] ;
}

【讨论】:

    【解决方案3】:

    您也可以尝试使用一组玩家 ID 来启动排行榜,以减少玩家数量:

    GKLeaderboard *board = [[[GKLeaderboard alloc] initWithPlayerIDs:[NSArray arrayWithObject:myGCPlayerID]] autorelease];
    

    【讨论】:

      【解决方案4】:

      使用 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
              }
          })
      }
      

      【讨论】:

        猜你喜欢
        • 2012-04-30
        • 2013-08-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-08
        • 2016-10-21
        • 1970-01-01
        相关资源
        最近更新 更多