游戏中心成就不止一次解锁

时间:2014-05-19 16:35:08

标签: ios cocoa-touch game-center achievements

我已经在线阅读了有关如何在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];
        }];
    }
}
}

谢谢你的时间,Dan。

1 个答案:

答案 0 :(得分: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];
        }];
    }
}
}