【问题标题】:GameKit achievement questionsGameKit 成就问题
【发布时间】:2011-06-28 10:02:52
【问题描述】:

我的 Game Center 成就出现在 Game Center 中,因此我知道我的实施在报告中是正确的。

几个问题。

首先,在 Game Center 中,它没有在图像上显示百分比视图...即成就旁边的 2% 完成,即使我报告了 0.02。我知道正在报告成就,因为如果我向它扔 100,它就会记录成就。

其次,我的成就不会在奖励时显示给用户。据我了解,这个功能应该由 gamekit 自动处理。我的印象是,小模式会出现,让用户知道他们完成了一项成就。我现在认为我必须做一些事情,因为没有出现小模态。

我会附上我的代码,但大部分都是库存。

我的最后一个问题是检索分数。我相信我将不得不存储我自己的分数,因为我当前的实现看起来不太适合。

提前谢谢...

- (void) loadAchievements
{    [GKAchievement loadAchievementsWithCompletionHandler:^(NSArray *achievements,        NSError *error) {
if (error != nil)
{
    // handle errors
}
if (achievements != nil)
{
    // process the array of achievements.
}
}];
}

-(float)getAchievementPercentageForIdentifier:(NSString *)identifier {

__block float percentage = 0;

[GKAchievement loadAchievementsWithCompletionHandler:^(NSArray *achievements, NSError *error) {
    if (error != nil)
    {
        // handle errors
    }
    if (achievements != nil)
    {
        // process the array of achievements.

        for (GKAchievement *achievement in achievements) {

            if ([achievement.identifier isEqualToString:identifier]) {

                percentage = achievement.percentComplete;
                NSLog(@"percent complete --> %f", achievement.percentComplete);

            }

        }

    }
}];

NSLog(@"Percentage --> %f", percentage);

return percentage;

}

- (void) reportAchievementIdentifier: (NSString*) identifier percentComplete: (float) percent
{
GKAchievement *achievement = [[[GKAchievement alloc] initWithIdentifier: identifier]   autorelease];
if (achievement)
{
    achievement.percentComplete = percent;
    [achievement reportAchievementWithCompletionHandler:^(NSError *error)
     {
         if (error != nil)
         {
             // Retain the achievement object and try again later (not shown).
         }
     }];
}
 }

 -(void) addCompletedGameToAchievements {

float oneGamePercentage = 0;
float tenGamePercentage = 0;
float fiftyGamePercentage = 0;
float hundredGamePercentage = 0;
float fivehundredGamePercentage = 0;
float thousandGamePercentage = 0;

int gamesComplete = 0;

oneGamePercentage = [self getAchievementPercentageForIdentifier:kAchievementGamesCompletedOne];
tenGamePercentage = [self getAchievementPercentageForIdentifier:kAchievementGamesCompletedTen];
fiftyGamePercentage = [self getAchievementPercentageForIdentifier:kAchievementGamesCompletedFifty];
hundredGamePercentage = [self getAchievementPercentageForIdentifier:kAchievementGamesCompletedHundred];
fivehundredGamePercentage = [self getAchievementPercentageForIdentifier:kAchievementGamesCompletedFivehundred];
thousandGamePercentage = [self getAchievementPercentageForIdentifier:kAchievementGamesCompletedThousand];

if (oneGamePercentage != 100) {

    [self reportAchievementIdentifier:kAchievementGamesCompletedOne percentComplete:100];

}

if (tenGamePercentage != 100) {

    gamesComplete = tenGamePercentage * 10;
    gamesComplete++;

    [self reportAchievementIdentifier:kAchievementGamesCompletedTen percentComplete:(gamesComplete * .10)];

}

if (fiftyGamePercentage != 100) {

    gamesComplete = fiftyGamePercentage * 50;
    gamesComplete++;


    NSLog(@"fifty game reported %f ",(gamesComplete * .02));
    [self reportAchievementIdentifier:kAchievementGamesCompletedFifty percentComplete:(gamesComplete * .02)];

}

if (hundredGamePercentage != 100) {

    gamesComplete = hundredGamePercentage * 100;
    gamesComplete++;

    [self reportAchievementIdentifier:kAchievementGamesCompletedHundred percentComplete:(gamesComplete * .01)];

}

if (fivehundredGamePercentage != 100) {

    gamesComplete = fivehundredGamePercentage * 500;
    gamesComplete++;

    [self reportAchievementIdentifier:kAchievementGamesCompletedFivehundred percentComplete:(gamesComplete * .002)];

}

if (fivehundredGamePercentage != 100) {

    gamesComplete = thousandGamePercentage * 1000;
    gamesComplete++;

    [self reportAchievementIdentifier:kAchievementGamesCompletedThousand percentComplete:(gamesComplete * .0001)];

}

NSLog(@"100 game percentage -- > %f", hundredGamePercentage);

}

【问题讨论】:

  • 你应该为 2% 报告 2.0 - 你不是为 100% 报告 100.0 吗?

标签: iphone gamekit


【解决方案1】:

很多问题...

  • 我对递增 gamesComplete 背后的逻辑感到困惑
  • 您应该将它们存储在本地,而不是每次都询问 GameCenter。
  • -getAchievementPercentageForIdentifier: 将始终返回 0,因为 GameKit 方法是异步的。
  • GKAchievement.percentageComplete 是一个百分比。你需要乘以 100。

我认为你必须自己做成就通知。

【讨论】:

  • gamesCImports 是我如何从百分比转换为知道他们完成了多少游戏的方法。这样我就可以转身报告更新的百分比。我不会乘以 100,因为值的数量会发生变化。我确实根据成就中的总游戏数移动了小数点。我越看它似乎我将不得不在本地存储。不过,我真的希望跨设备同步。
  • 你可能会在“跨设备同步”上做一个糟糕的尝试,但你必须处理 Game Center 调用是异步的事实。 (“不好”,因为更新涉及竞争条件和痛苦的错误处理,而且您仍然需要在本地存储一些东西。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多