Кодирование второго списка лидеров
Я делаю игру, в которой игрок может набрать положительный высокий балл или отрицательный низкий балл в зависимости от выбора, который они делают. Код, который я использовал, прекрасно работает, если есть только одна таблица лидеров, но у меня возникают проблемы, когда я пытаюсь добавить вторую. 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;
Надеюсь, это ответит на ваш вопрос!