2014-01-19 2 views
2

В моем приложении у меня есть достижение для 10 побед подряд. Поэтому, когда пользователь выигрывает 5 игр подряд, я сообщаю о достижении 50% завершенности - это отлично работает. Когда пользователь теряет некоторые игры, я вызываю метод resetAchievment, который устанавливает процент в 0 и снова сообщает процент. Однако, когда я перезапускаю приложение, процент читается из GKAchivement, и он по-прежнему показывает 50%.Сбросить одиночное достижение gamecenter

- (void) resetAchievement 
{ 
    _gamekitAchievement.percentComplete=0.0f; 
    _counter = 0; 
    [self report]; 
} 

- (void) report 
{ 
    _gamekitAchievement.showsCompletionBanner = YES; 
    [_gamekitAchievement reportAchievementWithCompletionHandler:^(NSError *error) 
    { 
     if (error) 
     { 
      NSLog(@"reporting Achievment: %@ failed, error: %@", _gamekitAchievement.identifier, [error localizedDescription]); 
     } 
    }]; 
} 

Невозможно сообщить меньший процент снова - или я делаю что-то неправильно?

ответ

2

Короткий ответ: невозможно сообщить меньший процент снова.

Длинный ответ: более низкий балл GameCenter не перезапишет более высокий.

Например, у вас высокий балл 10 баллов, и он записан в GameCenter. Если в следующей попытке вы получите 5 очков, и они будут отправлены в GC, ваш высокий балл 10 не будет затронут.

Аналогичным образом, если вы попытаетесь «сбросить» свой счет, он считает отправкой новой оценки 0, поэтому это не изменит ситуацию.

Это относится только к оценкам и достижениям, представленных в GameCenter, внутри вашего приложения вы можете сделать все, что вы хотите (например, ваш собственный полноразмерный баннер или что-то)

3

У меня нет опыта работы с GameKit, но из-за чтения документации и поиска в Интернете кажется, что вы можете сообщить только прогресс, а не регрессия (?) Не говоря уже о том, что вы можете только сбросить вСЕ достижения ... Возможно, следующие будут по-прежнему помогут вам достичь (гм), что вы хотите:

  • Обновить все ваши локальные данные достижения с + (void)loadAchievementsWithCompletionHandler:
  • хранить эти данные в userDefaults для безопасности
  • Do NOT сбросить локальные данные достижения
  • Сбросить все достижения с помощью + (void)resetAchievementsWithCompletionHandler:
  • Изменить значение процента Завершить 0 на достижение, о котором идет речь.
  • доклад о ходе работы всех достижений с вашего локального хранилища

Теперь, когда я упоминаю, не имея практического опыта этих рамок выше может быть непрактичным по целому ряду причин, я не в курсе (как, например, прогресс представлен игроку). Угадайте, что это было достойно сделать, чтобы поделиться идеей так или иначе ...

+0

Звучит как тестовая идея! –

+0

Сохранение его в userDefaults звучит как хорошая идея. По какой-то странной причине я думал, что мой единственный шанс сохранить прогресс - это процент, который я сообщаю. Хотя я уже храню другие вещи в userDefaults и CoreData. –

1

Если вы думаете об этом, 5 побед не составляет 50% от пути туда, так как они могут потерять 6-е место, а затем выиграть 10 подряд, в в этом случае они сыграли 16 полных игр и 5 побед были больше похожими на 30%. В этом случае это все или ничего, поэтому не сообщайте ничего, пока у них не будет всего 10.

0

Что вам нужно сделать, это сохранить его NSUserdefaults. затем вызовите значение NSUser по умолчанию и проверьте, какое число оно используется с помощью оператора IF.

-(void)checkAcheivement{ 
scoreNumber = [NSUserDefaults standardUserDefaults] objectForKey:@"GamesWon"] 
if(scoreNumber == 10){ 
//Run code to save achievement in Game Center(_gamekit stuff) 

} 

//-(void)checkScoreFire{ 
//scoreNumber = [NSUserDefaults standardUserDefaults] objectForKey:@"GamesWon"] 
//if(scoreNumber == 5){ 
//Run code to set up alert view for 5 wins below 
//UIAlertView* message = [[UIAlertView alloc] 
//      initWithTitle: @"Alert" 
//      message: @"You are halfway to the Achievement!" 
//      delegate: self 
//      cancelButtonTitle: @"Dismiss" 
// [message show]; 


//} 




//to save score use this method: 

-(void)saveScore{ 
scoreNumber = [NSUserDefaults standardUserDefaults] objectForKey:@"GamesWon"] 
if(gameScore > scoreNumber){ 
[[NSUserDefaults standardUserDefaults]setInteger:scoreNumber forKey:@"GamesWon"]; 
} 

Это только вывесит достижение, если это десять, я не предлагаю не прикладывая достижение в до тех пор, потому что это делает его более трудным. Я также предлагаю настроить AlertView, чтобы он знал, что они находятся на полпути. Вы можете сделать это с помощью кода, описанного выше, с помощью метода checkScoreFive. Не забудьте также объявить все в файле .h.

IBOutlet UIAlertView *AlertView; 
-(void)checkAcheivement; 
-(void)checkScoreFire; 
-(void)saveScore; 
int gameScore; 
int scoreNumber; 
1

Обратите внимание, что хранение продвижения к достижению в NSUserDefaults не учитывает пользователей GameCenter. Это означает, что если игрок A (зарегистрированный в GameCenter) достигнет определенного прогресса и на 90% продвинется, другой игрок B на том же устройстве войдет в GameCenter со своей учетной записью, он начнет с прогресса, достигнутого игроком A.

Вы можете решая это, сохраняя целый NSDictionary с идентификаторами Player как ключи в NSUserDefaults.

Смежные вопросы