如何从游戏中心获取本地玩家分数
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”变量!
【讨论】:
以上是关于如何从游戏中心获取本地玩家分数的主要内容,如果未能解决你的问题,请参考以下文章