【问题标题】:Game Center achievement unlocking more than once游戏中心成就解锁不止一次
【发布时间】:2014-05-19 16:35:08
【问题描述】:

我在网上学习了关于如何在 iOS 应用程序中使用 Game Center 的精彩教程。可以在这里找到:http://code.tutsplus.com/tutorials/ios-sdk-game-center-achievements-and-leaderboards-part-2--mobile-5801

但是提交成就的代码似乎解锁了已经解锁的成就,我不明白为什么。这是我处理成就的方法:

-(void)submitAchievement:(NSString*)identifier percentComplete:(double)percentComplete {

if (self.earnedAchievementCache == NULL) {

    [GKAchievement loadAchievementsWithCompletionHandler: ^(NSArray *scores, NSError *error) {

        if (error == NULL) {
            NSMutableDictionary *tempCache = [NSMutableDictionary dictionaryWithCapacity: [scores count]];

            for (GKAchievement *score in tempCache) {
                [tempCache setObject: score forKey: score.identifier];
            }

            self.earnedAchievementCache = tempCache;
            [self submitAchievement:identifier percentComplete: percentComplete];
        }

        else {
            // Something broke loading the achievement list. Error out, and we'll try again the next time achievements submit.
            [self callDelegateOnMainThread: @selector(achievementSubmitted:error:) withArg: NULL error: error];
        }
    }];
}

else {
    // Search the list for the ID we're using...
    GKAchievement *achievement = [self.earnedAchievementCache objectForKey:identifier];

    if (achievement != NULL) {

        if ((achievement.percentComplete >= 100.0) || (achievement.percentComplete >= percentComplete)) {
            // Achievement has already been earned so we're done.
            achievement = NULL;
        }

        achievement.percentComplete = percentComplete;
    }

    else {
        achievement = [[[GKAchievement alloc] initWithIdentifier:identifier] autorelease];
        achievement.percentComplete = percentComplete;
        // Add achievement to achievement cache...
        [self.earnedAchievementCache setObject:achievement forKey:achievement.identifier];
    }

    if (achievement != NULL) {
        // Submit the Achievement...
        [achievement reportAchievementWithCompletionHandler: ^(NSError *error) {
            [self callDelegateOnMainThread:@selector(achievementSubmitted:error:) withArg:achievement error:error];
        }];
    }
}
}

感谢您抽出宝贵时间,丹。

【问题讨论】:

  • 我不确定这是否会导致问题,但我认为您必须在 if 语句中使用 nil 而不是 NULL
  • 我看到教程也有 NULL 但我阅读了一些 cmets 并且很多人发布他们在发布到游戏中心时遇到问题。
  • @Yan 我尝试将它们更改为 nil 但仍然不起作用嗯 :(
  • 那意味着当成就已经完成时调用[成就reportAchievementWithCompletionHandler ...?
  • @Yan 是的,所以无论如何我都会调用那个方法......这很奇怪。它不应该调用成就已经完成,因为它不应该进入最后一个 if 语句..

标签: ios cocoa-touch game-center achievements


【解决方案1】:

你能试试这个代码并查看日志吗?我添加了 NSLog 语句以查看代码是否检测到成就已完成并将成就设置为 nil。还要从代码中删除 NULL。让我知道结果如何。

-(void)submitAchievement:(NSString*)identifier percentComplete:(double)percentComplete {

if (!self.earnedAchievementCache) {

    [GKAchievement loadAchievementsWithCompletionHandler: ^(NSArray *scores, NSError *error) {

        if (!error) {
            NSMutableDictionary *tempCache = [NSMutableDictionary dictionaryWithCapacity: [scores count]];

            for (GKAchievement *score in scores) { // the error is here
                [tempCache setObject: score forKey: score.identifier];
            }

            self.earnedAchievementCache = tempCache;
            [self submitAchievement:identifier percentComplete: percentComplete];
        }

        else {
            // Something broke loading the achievement list. Error out, and we'll try again the next time achievements submit.
            [self callDelegateOnMainThread: @selector(achievementSubmitted:error:) withArg: NULL error: error];
        }
    }];
}else {
    // Search the list for the ID we're using...
    GKAchievement *achievement = [self.earnedAchievementCache objectForKey:identifier];
    NSLog(@"achievement %f",achievement.percentComplete);
    if (achievement) {

        if ((achievement.percentComplete >= 100.0) || (achievement.percentComplete >= percentComplete)) {
            NSLog(@"Achievement has already been earned so we're done.");
            achievement = nil;
        }else{
                achievement.percentComplete = percentComplete;
        }


    }else {
        achievement = [[[GKAchievement alloc] initWithIdentifier:identifier] autorelease];
        achievement.percentComplete = percentComplete;
        // Add achievement to achievement cache...
        [self.earnedAchievementCache setObject:achievement forKey:achievement.identifier];
    }

    if (achievement) {
        NSLog(@"Submit the Achievement...");
        [achievement reportAchievementWithCompletionHandler: ^(NSError *error) {
            [self callDelegateOnMainThread:@selector(achievementSubmitted:error:) withArg:achievement error:error];
        }];
    }
}
}

【讨论】:

  • 嘿@Yan - 感谢您的帮助,但它似乎仍然不起作用。这是 NSLog 输出:“提交成就..”和“beg02”(beg02 是我在 iTunes 连接中设置的游戏中心标识符。
  • 我添加了一个 NSLog 来查看在你执行 GKAchievement *achievement = [self.earnedAchievementCache objectForKey:identifier] 之后实际成就是否不为零;可能你实际上没有获得成就
  • 是的,我现在这样做。但是如果我重新构建并运行游戏,它会再次显示成就,即使它已经完成了。
  • 那么提交成就有用吗?它会尝试重新提交吗?在游戏中获得成就可能有问题?
  • 哈哈。好吧,您使我免于数小时不了解出了什么问题。我当然会给你的答案打绿色勾:D
猜你喜欢
  • 2023-04-01
  • 1970-01-01
  • 2016-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-01
  • 1970-01-01
相关资源
最近更新 更多