【问题标题】:How to get local player score from Game Center如何从游戏中心获取本地玩家分数
【发布时间】:2014-02-05 23:46:52
【问题描述】:

如何从排行榜游戏中心获取本地玩家的分数?我试过这段代码,但它什么也没返回。有谁知道如何解决它,或者有更好的方法来获得分数吗?

- (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: ...

有可能吗?

【问题讨论】:

  • 使用协议传递本地玩家分数。 :-)

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


【解决方案1】:

您的代码似乎没有任何我可以看到的错误。我建议显示标准排行榜界面,以查看您报告分数的代码是否实际工作正常。如果是这样,您应该在排行榜中看到分数。下面的代码在我的游戏中运行,我知道分数报告工作正常,因为它显示在默认的游戏中心 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
 }];

【讨论】:

    【解决方案2】:

    您不能在块外返回分数。在此代码中,首先“返回分数”将在方法“loadScoresWithCompletionHandler”之前执行。此外,您还没有为“分数”设置初始值,此方法将返回完全随机的值。 我建议您将适当的代码放在块中,而不是:

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

    【讨论】:

      【解决方案3】:

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

      您将排行榜请求放入的方法应该纯粹用于发送请求。该方法将在排行榜请求完成之前完成执行,因此您的 "score = [NSString stringWithFormat:@"%lld", scoreInt];"在返回“分数”之后执行该行,直到该行被执行。

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

      处理您的情况的最佳方法是在此方法中不返回任何内容,只需在块将 score 设置为非 null 值后按照您的意图使用“score”变量!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-29
        • 2016-11-07
        • 2022-01-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多