Кодирование второго списка лидеров

Я делаю игру, в которой игрок может набрать положительный высокий балл или отрицательный низкий балл в зависимости от выбора, который они делают. Код, который я использовал, прекрасно работает, если есть только одна таблица лидеров, но у меня возникают проблемы, когда я пытаюсь добавить вторую. TEHS является идентификатором списка лидеров для HighScore, а TELS является идентификатором списка лидеров для LowScore.

Я аутентифицирую местного игрока:

-(void)authenticateLocalPlayer{
GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];

localPlayer.authenticateHandler = ^(UIViewController *viewController, NSError *error){
    if (viewController != nil) {
        [self presentViewController:viewController animated:YES completion:nil];
    }
    else{
        if ([GKLocalPlayer localPlayer].authenticated) {
            _gameCenterEnabled = YES;

            // Get the default leaderboard identifier.
            [[GKLocalPlayer localPlayer] loadDefaultLeaderboardIdentifierWithCompletionHandler:^(NSString *leaderboardIdentifier, NSError *error) {

                if (error != nil) {
                    NSLog(@"%@", [error localizedDescription]);
                }
                else{
                    TEHS = leaderboardidentifier;
                }
            }];
        }

        else{
            _gameCenterEnabled = NO;
        }
    }
};
}

Результаты сообщаются:

-(void)reportHighScore{

GKScore *highscore = [[GKScore alloc] initWithLeaderboardIdentifier:TEHS];
highscore.value = HighScoreNumber;

[GKScore reportScores:@[highscore] withCompletionHandler:^(NSError *error) {
    if (error != nil) {
        NSLog(@"%@", [error localizedDescription]);
    }
}];
}

-(void)reportLowScore {

GKScore *lowscore = [[GKScore alloc] initWithLeaderboardIdentifier:TELS];
lowscore.value = LowScoreNumber;

[GKScore reportScores:@[lowscore] withCompletionHandler:^(NSError *error) {
    if (error != nil) {
        NSLog(@"%@", [error localizedDescription]);
    }
}];
}

И списки лидеров отображаются, когда игрок активирует:

-(void)showLeaderboardAndAchievements:(BOOL)shouldShowLeaderboard{
GKGameCenterViewController *gcViewController = [[GKGameCenterViewController alloc] init];

gcViewController.gameCenterDelegate = self;

if (shouldShowLeaderboard) {
    gcViewController.viewState = GKGameCenterViewControllerStateLeaderboards;
    gcViewController.leaderboardIdentifier = TEHS;
}
else{
    gcViewController.viewState = GKGameCenterViewControllerStateAchievements;
}

[self presentViewController:gcViewController animated:YES completion:nil];
}

Либо reportLowScore, либо reportHighScore будут работать при изменении

gcViewController.leaderboardIdentifier = TEHS;

а также

TEHS = идентификатор лидера;

соответствовать их соответствующему идентификатору. Итак, прямо сейчас, этот код работает для High Score (TEHS), и если бы я изменил вышеупомянутые два на TELS, Low Score сработал бы. Я просто не совсем уверен, что мне нужно сделать, чтобы аутентифицировать LocalPlayer и showLeaderboardAndAchievements, чтобы заставить обе таблицы лидеров работать.

1 ответ

Решение

У меня есть игра в App Store, в которой есть два списка лидеров, один для очков и один для очищенных уровней. Вместо того, чтобы иметь один метод для каждой таблицы лидеров, я сделал один метод для представления результатов. Вот этот метод:

-(void) submitScore:(int64_t)score Leaderboard: (NSString*)leaderboard
{

    //1: Check if Game Center
    //   features are enabled
    if (!_gameCenterFeaturesEnabled) {
        return;
    }

    //2: Create a GKScore object
    GKScore* gkScore =
    [[GKScore alloc]
     initWithLeaderboardIdentifier:leaderboard];

    //3: Set the score value
    gkScore.value = score;

    //4: Send the score to Game Center
    [gkScore reportScoreWithCompletionHandler:
     ^(NSError* error) {

         [self setLastError:error];

         BOOL success = (error == nil);

         if ([_delegate
              respondsToSelector:
              @selector(onScoresSubmitted:)]) {

             [_delegate onScoresSubmitted:success];
         }
     }];


}

Если вы хотите представить свои лучшие результаты, все, что вам нужно сделать, это добавить что-то вроде:

[[GCHelper sharedGameKitHelper] submitScore:myLowScore Leaderboard:TELS];
[[GCHelper sharedGameKitHelper] submitScore:myHighScore Leaderboard:TEHS];

GCHelper - это класс, который содержит мой метод submitScore:Leaderboard:.

Для просмотра списка лидеров или достижений в вашем приложении попробуйте это:

- (void) presentLeaderboards {
    GKGameCenterViewController* gameCenterController = [[GKGameCenterViewController alloc] init];
    gameCenterController.viewState = GKGameCenterViewControllerStateLeaderboards;
    gameCenterController.gameCenterDelegate = self;
    [self presentViewController:gameCenterController animated:YES completion:nil];
}

- (void) gameCenterViewControllerDidFinish:(GKGameCenterViewController*) gameCenterViewController {
    [self dismissViewControllerAnimated:YES completion:nil];
}

- (void) presentAchievements {
    GKGameCenterViewController* gameCenterController = [[GKGameCenterViewController alloc] init];
    gameCenterController.viewState = GKGameCenterViewControllerStateAchievements;
    gameCenterController.gameCenterDelegate = self;

Надеюсь, это ответит на ваш вопрос!

Другие вопросы по тегам