2012-11-20 4 views
0

Я использую эту библиотеку, чтобы сообщить результаты и достижение в моем приложении: https://github.com/csddavies/DDGameKitHelperGKAchievement разблокирован слишком рано?

Так что в моем приложении я сообщаю проценты, чтобы пользователь мог знать, насколько они близки к завершению достижения. Так что я сделать что-то вроде этого:

[[DDGameKitHelper sharedGameKitHelper] reportAchievement:@"Achievement1" percentComplete:totalTime/300.0f]; 

Однако, как представляется, сообщив, что я закончил достижение «Achievement1», несмотря на то, что я не сделал. Когда я NSLog totalTime/300.0f, я получаю значение, подобное . 0,563 и NOT .

Так что теперь я думаю, что что-то должно быть неправильно с методом reportAchievement, поэтому я посмотрел на него, и я не уверен, что может быть неправильным. Вот методы, связанные с reportAchievement:

-(void) reportAchievement:(NSString*)identifier percentComplete:(float)percent 
{ 
    if (isGameCenterAvailable == NO) 
     return; 

    GKAchievement* achievement = [self getAchievement:identifier]; 
    if (achievement.percentComplete < percent) 
    { 
     NSLog(@"new achievement %@ reported", achievement.identifier); 
     achievement.percentComplete = percent; 
     [achievement reportAchievementWithCompletionHandler:^(NSError* error) 
     { 
      [delegate onReportAchievement:(GKAchievement*)achievement]; 
     }]; 

     [self saveAchievements]; 
    } 
} 

-(GKAchievement*) getAchievement:(NSString*)identifier 
{ 
    GKAchievement* achievement = [achievements objectForKey:identifier]; 

    if (achievement == nil) 
    { 
     achievement = [[[GKAchievement alloc] initWithIdentifier:identifier] autorelease]; 
     [achievements setObject:achievement forKey:achievement.identifier]; 
    } 

    return achievement; 
} 

Так что-нибудь здесь, что может привести к моим достижениям должны представляться как завершено в начале, даже если они на самом деле нет?

Спасибо!

Edit1:

2012-11-19 20:50:15.946 App[16894:907] percent: 0.005556 
2012-11-19 20:50:15.947 App[16894:907] achievement percentComplete: 0.004861 
2012-11-19 20:50:15.972 App[16894:907] percent: 0.000000 
2012-11-19 20:50:15.973 App[16894:907] achievement percentComplete: 0.000000 
2012-11-19 20:50:15.974 App[16894:907] percent: 0.026000 
2012-11-19 20:50:15.974 App[16894:907] achievement percentComplete: 0.024000 
2012-11-19 20:50:16.003 App[16894:907] percent: 0.002600 
2012-11-19 20:50:16.004 App[16894:907] achievement percentComplete: 0.002400 
2012-11-19 20:50:16.010 App[16894:907] percent: 0.000000 
2012-11-19 20:50:16.011 App[16894:907] achievement percentComplete: 0.000000 
2012-11-19 20:50:16.012 App[16894:907] percent: 0.016667 
2012-11-19 20:50:16.012 App[16894:907] achievement percentComplete: 0.016667 
2012-11-19 20:50:16.013 App[16894:907] percent: 0.000000 
2012-11-19 20:50:16.014 App[16894:907] achievement percentComplete: 0.000000 
+0

Попробуйте добавить NSLog для получения значения «процента». И обновите вопрос – CReaTuS

+0

Хорошо, я добавил его, так как вы можете видеть, что некоторые проценты всегда равны 0,00000 по какой-то нечетной причине. Теперь также есть 3 0,000000 номеров, что имеет смысл, потому что одни и те же 3 достижения постоянно появляются каждый раз, когда я сообщаю им. –

ответ

0

Я считаю, что проблема здесь в том, что в чеке if (achievement.percentComplete < percent) это просто слишком расплывчато. Мой процентный комплект может составлять 5%, а мое процентное значение может составлять 6%, но ни в коем случае не заканчивается на 100%. Таким образом, с тем, как метод выше, он просто покажет баннер достижений каждый раз, когда будет обновлен процент завершенности в достижении, и это не так, как должен работать Game Center. Я также заметил, что даже несмотря на то, что баннер показал, что я разблокировал это достижение, я действительно не сделал этого, когда я зарегистрировался в приложении Game Center. Таким образом, следующий метод, что я сделал вместо этого:

-(void) reportAchievement:(NSString*)identifier percentComplete:(float)percent 
{ 
    if (isGameCenterAvailable == NO) 
     return; 

    GKAchievement* achievement = [self getAchievement:identifier]; 
    if (percent > achievement.percentComplete) 
    { 
     NSLog(@"new achievement %@ reported", achievement.identifier); 
     achievement.percentComplete = percent; 
     [achievement reportAchievementWithCompletionHandler:^(NSError* error) { 
      if (achievement.isCompleted) { 
       [delegate onReportAchievement:(GKAchievement*)achievement]; 
      } 
     }]; 

     [self saveAchievements]; 
    } 
} 

В этом коде он все равно будет сообщать обновленное значение по отношению к 100%, но он будет показывать только баннер, если isComplete BOOL из GC возвращается YES.