我即将完成第一个使用(并要求)游戏中心的应用程序。我没有取得成就,只是一个高分制度。我已将所有内容都插入,我的应用程序已在iTunesConnect中注册并启用了游戏中心,当我记录高分时,它会显示在列表中。
一件不起作用的是“等级”。在[GKScore reportScoreWithCompletionHandler:]
的完成块中,即使用户获得了新的高分,我的GKScore对象的rank属性也始终为0。
例如,在我运行的应用程序中:
GKScore *scoreReporter = [[GKScore alloc] initWithCategory:@"1"];
scoreReporter.value = 2200003; // test value
[scoreReporter reportScoreWithCompletionHandler:^(NSError *error) {
if (error != nil)
{
NSLog(@"An error occured reporting the Game Center score: %@", error);
}
NSLog(@"Score: %@", scoreReporter);
NSLog(@"Score: %d", scoreReporter.rank);
}];
...没有错误发生,输出为:
Score: <GKScore: 0x361a3c0><0x361a3c0> player=G:1127411264 rank=0 date=2012-02-04 22:19:52 +0000 value=2200002 formattedValue=(null) context=(null)
Score: 0
iTunesConnect中是否有可能缺少的东西?离开沙箱后排名会开始起作用吗?任何正确方向的指针都将受到赞赏。
答案 0 :(得分:3)
您的代码没有错误。如果您只是创建GKScore对象,则rank的值始终为0。它仅对从Game Center收到的分数对象有效。 请阅读此文档: https://developer.apple.com/library/ios/#documentation/GameKit/Reference/GKScore_Ref/Reference/Reference.html
答案 1 :(得分:1)
laxcat,你不能立即得到刚加入得分的排名,但经过一段时间后,你可以执行获得用户排名的请求:
GKLeaderboard *lb = [[[GKLeaderboard alloc] init] autorelease];
lb.category = @"YOURLeaderBoardID";
lb. timeScope = GKLeaderboardTimeScopeToday;
[lb loadScoresWithCompletionHandler:^(NSArray *scores, NSError *error)
{
GKLocalPlayer *lp = [GKLocalPlayer localPlayer];
for (GKScore* score in scores)
{
if ([score.playerID sEqualToString:lp.playerID])
{
NSLog(@"rank = %d", score.rank);
}
}
}];
请尝试这个,并告诉我它是否适合你。
答案 2 :(得分:1)
您需要将整数转换为int64_t
。在Objective-C术语中,这是LongLong
。你可以改变这个:
GKScore *myScore = [[GKScore alloc]initWithCategory:@"1"];
myScore.value = [[NSNumber numberWithInt:score] longLongValue]; //score should be of type int
答案 3 :(得分:0)
OBJ-C启用ARC - 获得排行榜中玩家的等级 没有必要循环分数,只需通过[YourAllocatedLeaderBoard] .localPlayerScore.rank直接访问(在完成处理程序中)
GKLeaderboard *leaderBoard = [[GKLeaderboard alloc]init];
[leaderBoard setIdentifier:@"yourLeaderboardID"];
[leaderBoard setTimeScope:GKLeaderboardTimeScopeAllTime];
[leaderBoard loadScoresWithCompletionHandler:^(NSArray<GKScore *> * _Nullable scores, NSError * _Nullable error) {
if (!error) {
NSLog(@"RANK %d",(int)leaderBoard.localPlayerScore.rank);
}else{
NSLog(@"*error* %@",error.localizedDescription);
}
}];
leaderBoard = nil;