编写苹果游戏中心应用程序(翻译 1.15 编程获取成就信息)

 

1.15 编程获取成就信息

问题

    你想获取本地玩家的成就进度。

解决方案

    调用GKAchievement类的loadAchievementsWithCompletionHandler:类方法。

讨论

    正如编程获取排行榜信息(条目1.11),我们也可以编程获取成就的最新进度信息,步骤如下:

    1. 验证本地玩家(条目1.5)。

    2. 调用GKAchievement类的loadAchievementsWithCompletionHandler:类方法。该方法接受一个返回void、接受两个参数的块对象。块对象的第一个参数是一个NSArray数组,它将包含从游戏中心取得的成就。第二个参数是一个NSError类型,将包含处理过程中发生的错误。

    3. 枚举成就数组中的对象。每个对象都是GKAchievement类型。

    下面是示例:

    - (void) authenticateAndGetAchievements{

        GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];

        NSLog(@"Authenticating the local player...");
        [localPlayer authenticateWithCompletionHandler:^(NSError *error) {

            if (error == nil){
                NSLog(@"Successfully authenticated the local player.");

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

                    NSUInteger counter = 1;
                    for (GKAchievement *achievement in achievements){
                        NSLog(@"Achievement %lu = %@",
                              (unsigned long)achievement,
                               achievement);
                        counter++;
                    }

                 }];

            } else {
                NSLog(@"Failed to authenticate the local player. %@", error);
            }
        }];
    }

    在调用authenticateAndGetAchievements方法之前,我在iTunes Connect中添加了另外一个成就(条目1.13),然后提交了一个10%的进度。因此,调用该方法我获得了如下的结果:

        Authenticating the local player...
        Successfully authenticated the local player.
        Achievement 111340288 = id: MGL1HP1C 50.000000
        Achievement 111379664 = id: MGL1HP2C 10.000000

    显然,你不会获得和我完全相同的结果;这依赖于设置的成就及其进度。

    如你在条目1.13中所见,每个成就都拥有两个描述:一个在玩家完成之前显示,另一个在玩家完成之后显示。你必须使用GKAchievementDescription来获取这两个描述,而不是GKAchievement具体点说,用的是GKAchievementDescription类的loadAchievementDescriptionsWithCompletionHandler:类方法获取对本地玩家有效的所有成就。每个成就都被封装到一个GKAchievementDescription对象中。loadAchievementDescriptionsWithCompletionHandler:方法接受一个返回void的块对象作为参数。该块对象拥有一个NSArray参数,它将包含获取到的成就;还拥有一个NSError参数,它将包含可能发生的错误。下面是示例:

        - (void) authenticateAndGetAchievementsInfo{

            GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];

            NSLog(@"Authenticating the local player...");
            [localPlayer authenticateWithCompletionHandler:^(NSError *error) {

                if (error == nil){
                    NSLog(@"Successfully authenticated the local player.");

                    [GKAchievementDescription
                     loadAchievementDescriptionsWithCompletionHandler:
                     ^(NSArray *descriptions, NSError *error) {

                        NSUInteger counter = 1;
                        for (GKAchievementDescription *description in descriptions){
                            NSLog(@"Achievement %lu. Description = %@",
                                  (unsigned long)counter,
                                   descriptions);
                            counter++;
                        }

                    }];

                } else {
                    NSLog(@"Failed to authenticate the local player. %@", error);
                }

            }];

        }

    下面是authenticateAndGetAchievementsInfo方法可能的打印结果:

        Authenticating the local player...
        Successfully authenticated the local player.
        Achievement 1. Description = (
            "id: MGL1HP1C\tvisible\tYou came out of
                Hidden Path 1 alive. Great job.",

            "id: MGL1HP2C\tvisible\tYou found Hidden
                Path 2. Congratulations."
        )
        Achievement 2. Description = (
            "id: MGL1HP1C\tvisible\tYou came out of
                Hidden Path 1 alive. Great job.",

             "id: MGL1HP2C\tvisible\tYou found Hidden
                Path 2. Congratulations."
        )

    成就描述对象包含一个ID;该ID可以用来和前面取得的成就对象进行匹配。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值