如何从游戏中心获取本地玩家分数

Posted

技术标签:

【中文标题】如何从游戏中心获取本地玩家分数【英文标题】: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: ...

有可能吗?

【问题讨论】:

使用协议传递本地玩家分数。 :-) 【参考方案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”变量!

【讨论】:

以上是关于如何从游戏中心获取本地玩家分数的主要内容,如果未能解决你的问题,请参考以下文章

Swift:检索 LocalPlayer GC 分数

保存 webview 游戏分数

以安全格式存储游戏偏好和保存的游戏

流星实时游戏 - 根据他们的分数匹配两名玩家?

如何从 Google Play 游戏服务排行榜中删除被黑分数?

游戏中心不保存分数