如何从Game Center获得本地球员得分

时间:2014-02-05 23:46:53

标签: iphone objective-c ios7 game-center gamekit

如何从排行榜游戏中心获得本地玩家的分数?我尝试了这个代码,但它没有返回任何内容。有人知道怎么解决它,还是有更好的方法来获得分数?

- (NSString*) getScore: (NSString*) leaderboardID
{
    __block NSString *score;
    GKLeaderboard *leaderboardRequest = [[GKLeaderboard alloc] init];
    if (leaderboardRequest != nil)
    {
        leaderboardRequest.identifier = leaderboardID;

        [leaderboardRequest loadScoresWithCompletionHandler: ^(NSArray *scores, NSError *error) {
            if (error != nil)
            {
                NSLog(@"%@", [error localizedDescription]);
            }
            if (scores != nil)
            {
                int64_t scoreInt = leaderboardRequest.localPlayerScore.value;
                score = [NSString stringWithFormat:@"%lld", scoreInt];
            }
        }];
    }
    return score;
}

我认为,该方法必须等待[leaderboardRequest loadScoresWithCompletionHandler完成:...

有可能吗?

3 个答案:

答案 0 :(得分:6)

您的代码似乎没有我能看到的任何错误。我建议显示标准排行榜界面,以查看报告分数的代码是否实际正常工作。如果是这样,您应该在排行榜中看到分数。以下代码适用于我的游戏,我知道得分报告工作正常,因为它显示在默认的游戏中心UI中。

GKLeaderboard *leaderboardRequest = [[GKLeaderboard alloc] init];
leaderboardRequest.identifier = kLeaderboardCoinsEarnedID;
[leaderboardRequest loadScoresWithCompletionHandler:^(NSArray *scores, NSError *error) {
    if (error) {
        NSLog(@"%@", error);
    } else if (scores) {
    GKScore *localPlayerScore = leaderboardRequest.localPlayerScore;
    CCLOG(@"Local player's score: %lld", localPlayerScore.value);
    }
}];

如果你不确定如何,下面的代码应该可以显示默认排行榜(iOS7):

 GKGameCenterViewController *gameCenterVC = [[GKGameCenterViewController alloc] init];
 gameCenterVC.viewState = GKGameCenterViewControllerStateLeaderboards;
 gameCenterVC.gameCenterDelegate = self;
 [self presentViewController:gameCenterVC animated:YES completion:^{
      // Code
 }];

答案 1 :(得分:3)

您无法在区块外返回分数。在此代码中,第一个“返回分数”将在方法“loadScoresWithCompletionHandler”之前执行。另外,您没有为“得分”设置初始值,此方法将返回完全随机的值。 我建议你把适当的代码放在块中,而不是:

int64_t scoreInt = leaderboardRequest.localPlayerScore.value;
score = [NSString stringWithFormat:@"%lld", scoreInt];

答案 2 :(得分:1)

返回方法后,排行榜请求完成。这意味着您将返回一个空字符串。

您放置排行榜请求的方法应该纯粹是为了发送请求。该方法将在排行榜请求完成之前完成执行,因此您的"得分= [NSString stringWithFormat:@"%lld",scoreInt];"在返回"得分后,正在执行该行。在该行执行之前为null。

解决方案是不使用发送请求的方法返回完成处理程序的结果。分数肯定是正确检索的,所以只需对完成处理程序内的分数做任何你需要的事情。您无法知道何时执行完成处理程序。事实上,这就是Apple允许您存储要在块中执行的代码的原因!虽然,理解如何使用块肯定会在以后执行,或者在你的情况下,在方法返回后的某个时候,这可能会令人困惑。

处理你的情况的最好方法是不返回此方法中的任何内容,只需使用"得分"在将块设置为非空值后,您打算使用变量!