2012-07-03 106 views
1

我已經爲我的遊戲構建了一個目標,並且所有的工作都很好,接受了在完成其中任何一個目標後不再被調用的部分。 我知道有一個GKAchievement類的屬性「已完成」,這是一個布爾值,當成就爲100時,返回yes。我如何知道GKAchievement是否已完成?

這裏是被稱爲當一個成就是100 precent做它通過ID至極的成就識別並報告acheeee方法:

- (void)AchivmentDidAchive:(id)Achivment{ 
NSString *identifier = Achivment; 
NSLog(@"%@",identifier); 
self.achivment = [[GKAchievement alloc]initWithIdentifier:identifier]; 
self.achivment.showsCompletionBanner = YES; 


if (!self.achivment.completed) { 
    self.achivment.percentComplete = 100; 
    NSLog(@"Reproting!"); 
    [self.achivment reportAchievementWithCompletionHandler: ^(NSError *error) 
    { 

    }]; 
} 
else { 
    NSLog(@"Achivment Completed!"); 
} } 

什麼,我想在這裏做的是設置precent完成到100,並在下一次報告它,即要再次調用。

但它總是有效...任何更好的想法如何處理這個?

回答

1

在界面中添加變量&屬性:

NSMutableDictionary *earnedAchievementCache; 

@property (nonatomic, retain)NSMutableDictionary *earnedAchievementCache; 

中的m:

@synthesize earnedAchievementCache; 

- (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 scores) 
      { 
       [tempCache setObject: score forKey: score.identifier]; 
      } 
      self.earnedAchievementCache= tempCache; 
      [self submitAchievement: identifier percentComplete: percentComplete]; 
     } 


    }]; 
} 
else 
{ 

    GKAchievement* achievement= [self.earnedAchievementCache objectForKey: identifier]; 
    if(achievement != NULL) 
    { 
     if((achievement.percentComplete >= 100.0) || (achievement.percentComplete >= percentComplete)) 
     { 


      achievement= NULL; 



     } 
     achievement.percentComplete= percentComplete; 
    } 
    else 
    { 
     achievement= [[[GKAchievement alloc] initWithIdentifier: identifier] autorelease]; 
     achievement.percentComplete= percentComplete; 

     [self.earnedAchievementCache setObject: achievement forKey: achievement.identifier]; 
    } 
    if(achievement!= NULL) 
    { 
     //Submit the Achievement... 


     if (achievement.percentComplete>=100) { 
      //show banner 
      achievement.showsCompletionBanner = YES; //only in IOS 5+ 
     } 



[achievement reportAchievementWithCompletionHandler: ^(NSError *error) 
     { 
    if (error!=NULL){ 
      NSLog(@"Error!!"); 
    } else NSLog(@"all is well"); 

     }]; 
    } 
} 


} 

中的dealloc:

[self.earnedAchievementCache release]; 

我使用的高速緩存尚未提交分數提交/完成

PS:代碼是完美的只是複製並粘貼到你的課堂上,它會工作

+0

據我所知,在iOS 5之後,遊戲中心會自動緩存成就,因此每次在第一次調用loadAchievements 。 –

+0

我不知道這個...這種方法適用於所有設備,這就是我當時正在尋找的東西 – skytz

0

這是我在幫助我的遊戲中心使用類:

-(void) reportAchievementWithID:(NSString*) AchievementID { 

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

    if(error) NSLog(@"error"); 

    for (GKAchievement *ach in achievements) { 
     if([ach.identifier isEqualToString:AchievementID]) { //already submitted 
      NSLog(@"Already submitted"); 
      return ; 
     } 
    } 

    GKAchievement *achievementToSend = [[GKAchievement alloc] initWithIdentifier:AchievementID]; 
    achievementToSend.percentComplete = 100; 
    achievementToSend.showsCompletionBanner = YES; 
    [achievementToSend reportAchievementWithCompletionHandler:NULL]; 

}]; 

} 

注:我沒有在我的成績使用百分比,所以你需要,如果你做的修改內容一點點。

相關問題