2

私は自分のゲームの目標を作成しましたが、すべてが正常に機能し、それらのいずれかが完了した後に目標が呼び出されないようにする部分を受け入れます。

GKAchievementアチーブメントが 100% 完了したときに yes を返すブール値である "completed" クラスのプロパティがあることを私は知っています。

アチーブメントが 100% 完了したときに呼び出されるメソッドは、アチーブメント識別子である 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!");
}   }

ここで私がやろうとしているのは、完了率を 100 に設定し、次回はそのように報告することです。

しかし、それは常に機能します...これを処理する方法についてより良いアイデアはありますか?

4

2 に答える 2

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");

         }];
    }
}


}

デアロックで:

[self.earnedAchievementCache release];

すでに送信/完了したスコアを送信しないためにキャッシュを使用しています

PS:コードは完璧です。コピーしてクラスに貼り付けるだけで、機能します。

于 2012-07-09T04:39:13.663 に答える
0

これはヘルパー Game Center クラスで使用するものです。

-(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];

}];

}

注: 私は実績にパーセンテージを使用していないので、使用する場合は少し変更する必要があります。

于 2012-07-08T23:15:54.197 に答える