Статьи

iOS SDK: достижения Game Center и списки лидеров — часть 2

Добро пожаловать во вторую и последнюю часть серии учебных материалов Game Center. В этом руководстве мы интегрируем достижения и списки лидеров, созданные с помощью iTunesConnect в первой части, с Objective-C и Xcode.

Перед тем, как мы начнем с Интерфейсного Разработчика, мы сначала установим необходимость настроить некоторые выходы и действия Откройте Game_CenterViewController.h и измените код следующим образом:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#import <UIKit/UIKit.h>
#import <GameKit/GameKit.h>
 
#import «GameCenterManager.h»
 
 
@class GameCenterManager;
 
@interface Game_CenterViewController : UIViewController <UIActionSheetDelegate, GKLeaderboardViewControllerDelegate, GKAchievementViewControllerDelegate, GameCenterManagerDelegate> {
     
     
    GameCenterManager *gameCenterManager;
     
    int64_t currentScore;
     
    NSString* currentLeaderBoard;
     
    IBOutlet UILabel *currentScoreLabel;
 
}
 
@property (nonatomic, retain) GameCenterManager *gameCenterManager;
@property (nonatomic, assign) int64_t currentScore;
@property (nonatomic, retain) NSString* currentLeaderBoard;
@property (nonatomic, retain) UILabel *currentScoreLabel;
 
 
— (IBAction) reset;
— (IBAction) showLeaderboard;
— (IBAction) showAchievements;
— (IBAction) submitScore;
— (IBAction) increaseScore;
 
 
— (void) checkAchievements;
 
@end

Сначала мы импортируем фреймворк GameKit и класс GameCenterManager . Затем мы объявляем класс GameCenterManager , чтобы мы могли объявить экземпляр этого класса в @interface . После этого мы объявляем следующих делегатов:

  • UIActionSheetDelegate (использовать лист действий)
  • GKLeaderboardViewControllerDelegate (чтобы показать таблицу лидеров в нашем приложении)
  • GKAchievementViewControllerDelegate (чтобы показать достижения в нашем приложении)
  • GameCenterManagerDelegate (для использования делегата GameCenterManager)

В @interface мы объявляем несколько экземпляров, а после этого создаем некоторые действия. Нажмите CMD + S, чтобы сохранить проект.

В папке «Game Center» в «Project Navigator» щелкните Game_centerViewController.xib .

Выберите окно просмотра и выберите фон, который вы предпочитаете. Я выбрал «Scroll View текстурированный цвет фона». Перетащите 5 «круглых кнопок Rect» из библиотеки на вид . Назовите и расположите их, как показано ниже. Также перетащите 2 «Метки» из библиотеки в представление . Назовите первый «Текущий счет» и удалите текст второй метки.

Интерфейс

Выберите «Владелец файла» и откройте инспектор подключений .

Владелец файла

Соедините действия с соответствующими кнопками, перетаскивая их на кнопки и выберите «Touch Up Inside» в меню.

Выберите Touch Up Inside
Инспектор соединений

Перетащите «CurrentScoreLabel» на этикетку без текста, и теперь мы закончили с интерфейсом.

Откройте AppSpecificValues.h и измените код следующим образом:

1
2
3
4
5
6
//Leaderboard Category IDs
#define kLeaderboardID @»1″
 
//Achievement IDs
#define kAchievementOneTap @»1_Tap»
#define kAchievement20Taps @»20_Taps»

Здесь мы создаем константы для нашего списка лидеров и наших достижений. Как вы можете видеть, идентификаторы те же, что мы создали в iTunes Connect.

Во-первых, мы собираемся синтезировать наши экземпляры и выпустить их. Мы также импортируем классы «AppSpecificValues» и «GameCenterManager». Поэтому откройте Game_CenterViewController.m и измените код в верхней части страницы следующим образом:

01
02
03
04
05
06
07
08
09
10
#import «Game_CenterViewController.h»
#import «AppSpecificValues.h»
#import «GameCenterManager.h»
 
@implementation Game_CenterViewController
 
@synthesize gameCenterManager;
@synthesize currentScore;
@synthesize currentLeaderBoard;
@synthesize currentScoreLabel;

Теперь измените методы viewDidUnload и dealloc следующим образом:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
— (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // eg self.myOutlet = nil;
     
    self.gameCenterManager = nil;
    self.currentLeaderBoard = nil;
    self.currentScoreLabel = nil;
}
 
 
— (void)dealloc {
    [gameCenterManager release];
    [currentLeaderBoard release];
    [currentScoreLabel release];
    [super dealloc];
}

Прокрутите вниз до метода «viewDidLoad», удалите его и измените код следующим образом:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
— (void)viewDidLoad {
    [super viewDidLoad];
     
    self.currentLeaderBoard = kLeaderboardID;
    self.currentScore = 0;
     
    if ([GameCenterManager isGameCenterAvailable]) {
         
        self.gameCenterManager = [[[GameCenterManager alloc] init] autorelease];
        [self.gameCenterManager setDelegate:self];
        [self.gameCenterManager authenticateLocalUser];
         
         
    } else {
         
        // The current device does not support Game Center.
                 
    }
 
}

Сначала мы устанавливаем нашу текущую таблицу лидеров на нашу таблицу лидеров, которую мы создали в iTunes Connect. После этого мы устанавливаем нашу текущую оценку на 0. Ваш высокий балл в Game Center не будет установлен на ноль, потому что он только отправляет баллы выше, чем предыдущий. Затем мы посмотрим, доступен ли Game Center на устройстве, на котором запущено приложение. Если Game Center доступен, мы аутентифицируем локального пользователя. Если Game Center недоступен, ничего не происходит. Вы можете сказать пользователю, что Game Center недоступен с предупреждением, но я оставляю его с комментарием.

Теперь вы можете протестировать свой проект. Нажмите CMD + R, чтобы построить и запустить его. Вы получите несколько предупреждений, но приложение запустится. Если вы уже вошли в Game Center, вы получите следующее сообщение: Welcome Back, «Game Center Name». Если вы не вошли в Game Center, вы получите предупреждение с вариантами создания новой учетной записи, входа в существующую учетную запись или отмены. Если вы отмените список лидеров и достижения не будут работать, потому что вы не вошли в Game Center. Кнопки не будут работать, потому что мы не сделали действия в Xcode.

Войдите в Game Center

Если вы использовали симулятор, закройте его и вернитесь в Xcode. Добавьте следующий код в метод viewDidLoad :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
— (IBAction) showLeaderboard
{
    GKLeaderboardViewController *leaderboardController = [[GKLeaderboardViewController alloc] init];
    if (leaderboardController != NULL)
    {
        leaderboardController.category = self.currentLeaderBoard;
        leaderboardController.timeScope = GKLeaderboardTimeScopeWeek;
        leaderboardController.leaderboardDelegate = self;
        [self presentModalViewController: leaderboardController animated: YES];
    }
}
 
— (void)leaderboardViewControllerDidFinish:(GKLeaderboardViewController *)viewController
{
    [self dismissModalViewControllerAnimated: YES];
    [viewController release];
}
 
— (IBAction) showAchievements
{
    GKAchievementViewController *achievements = [[GKAchievementViewController alloc] init];
    if (achievements != NULL)
    {
        achievements.achievementDelegate = self;
        [self presentModalViewController: achievements animated: YES];
    }
}
 
— (void)achievementViewControllerDidFinish:(GKAchievementViewController *)viewController;
{
    [self dismissModalViewControllerAnimated: YES];
    [viewController release];
}

Здесь мы создаем действия, чтобы показать список лидеров и достижения. Мы также создаем 2 метода, чтобы вернуться. Первое действие — показать таблицу лидеров. Как вы можете видеть, мы установили timeScope в GKLeaderboardTimeScopeWeek. Это означает, что раздел списка лидеров установлен на «Эта неделя». Есть 3 временных диапазона, и они прямо вперед:

  • GKLeaderboardTimeScopeToday
  • GKLeaderboardTimeScopeWeek
  • GKLeaderboardTimeScopeAllTime

Если вы соберете и запустите снова, кнопки «Показать таблицу лидеров» и «Показать достижения» будут работать. Теперь вы можете увидеть достижения, которые мы создали, а также соответствующие описания и точечные значения. Как вы можете видеть, раздел «Лидерборд» — «Эта неделя». Изменяя Time Scope в Xcode, вы можете установить для секции по умолчанию «All Time» или «Today». В таблице лидеров написано «Нет очков», потому что мы никогда не выставляли счет для этого лидера. Нажмите « Готово», чтобы закрыть представление Game Center.

Достижения Game Center и таблица лидеров

Добавьте следующий код в код, который мы только что создали:

1
2
3
4
5
6
7
— (IBAction) increaseScore
{
    self.currentScore = self.currentScore + 1;
    currentScoreLabel.text = [NSString stringWithFormat: @»%ld», self.currentScore];
     
    [self checkAchievements];
}

Здесь мы создаем акцию для увеличения вашего текущего рейтинга. Мы также обновляем наш ярлык на currentScore и вызываем функцию checkAchievements, чтобы узнать, достигли ли мы достижения.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
— (void) checkAchievements
{
    NSString* identifier = NULL;
    double percentComplete = 0;
    switch(self.currentScore)
    {
        case 1:
        {
            identifier= kAchievementOneTap;
            percentComplete= 100.0;
            break;
        }
        case 5:
        {
            identifier= kAchievement20Taps;
            percentComplete= 25.0;
            break;
        }
        case 10:
        {
            identifier= kAchievement20Taps;
            percentComplete= 50.0;
            break;
        }
        case 15:
        {
            identifier= kAchievement20Taps;
            percentComplete= 75.0;
            break;
        }
        case 20:
        {
            identifier= kAchievement20Taps;
            percentComplete= 100.0;
            break;
        }
         
    }
    if(identifier!= NULL)
    {
        [self.gameCenterManager submitAchievement: identifier percentComplete: percentComplete];
    }
}

В этой функции мы смотрим, достигли ли мы достижения с помощью оператора switch.
Сначала мы создаем NSString и double для хранения наших значений. В операторе switch мы проверяем, есть ли значение currentscore 1, 5, 10, 15 или 20. После оператора switch мы проверяем, есть ли что-то, сохраненное в NSString, которую мы создали. Если что-то хранится в этой строке NSString, мы отправляем достижение. Мы также представляем достижение, если вы выполнили его частично. Например, если вы нажали кнопку 10 раз, вы съели 50% достижения «20 нажатий».

Мы также хотим отправить или высокий балл, поэтому добавьте следующие действия в код, который мы только что создали:

1
2
3
4
5
6
7
— (IBAction) submitScore
{
    if(self.currentScore > 0)
    {
        [self.gameCenterManager reportScore: self.currentScore forCategory: self.currentLeaderBoard];
    }
}

Здесь мы проверяем, является ли оценка выше 0, потому что мы не хотим, чтобы оценка 0 была отправлена. Мы представили нашу текущую оценку для нашей текущей доски объявлений.

Создайте и запустите приложение еще раз, и теперь вы можете увеличить свой счет и отправить его. Если вы нажмете кнопку 15 раз и перейдете к «Показать достижения», вы увидите, что вы выполнили «1 нажатие» и получаете 75% от достижения «20 нажатий». Описание достижения «1 касание» также изменилось в тексте, который мы дали ему, когда он был в iTunes Connect, когда он был заработан. Закройте окно достижений и нажмите «Отправить счет», после чего нажмите «Показать Leaderbaord». Теперь вы видите ваш счет (если ваш текущий результат был выше 0).

Достижения Game Center и таблица лидеров

Добавьте следующий код в код, который мы только что создали:

01
02
03
04
05
06
07
08
09
10
11
— (IBAction) reset
{
    UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@»Are you sure you want to reset your score and achievements?»
                                                             delegate:self
                                                    cancelButtonTitle:@»Cancel»
                                               destructiveButtonTitle:@»Reset»
                                                    otherButtonTitles:nil];
    [actionSheet showInView:[self view]];
    [actionSheet release];
     
}

Здесь мы создали лист действий в действии сброса. Мы устанавливаем делегата на «себя», потому что мы хотим что-то сделать, если вы нажали кнопку «перезагрузить».

Под действием «сброс» добавьте следующий код:

01
02
03
04
05
06
07
08
09
10
11
— (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if (buttonIndex == 0) {
         
        [gameCenterManager resetAchievements];
         
        self.currentScore = 0;
        currentScoreLabel.text = [NSString stringWithFormat: @»%ld», self.currentScore];
 
    }
}

В этом коде мы смотрим кнопку ведьмы, которую вы нажали. Вы не можете редактировать кнопку «Отмена», поэтому мы начинаем с buttonIndex, равного 0. Если вы нажали кнопку «Сброс» на листе действий, gameCenterManager сбрасывает ваши достижения, currentScore устанавливается на 0, и мы обновляем текст currentScoreLabel. ,

Добавьте следующий код в код, который мы только что создали:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
— (void) achievementSubmitted: (GKAchievement*) ach error:(NSError*) error;
{
 
    if((error == NULL) && (ach != NULL))
    {
        if (ach.percentComplete == 100.0) {
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@»Achievement Earned!»
                                                              message:(@»%@»,ach.identifier)
                                                             delegate:nil
                                                    cancelButtonTitle:@»OK»
                                                    otherButtonTitles:nil];
            [alert show];
            [alert release];
        }
         
    }
    else
    {
        // Achievement Submission Failed.
     
    }
 
}

Сначала мы проверяем, не было ли ошибки и сохранено ли что-то в «ach». Если это так, то мы проверяем, является ли значение ach.presentComplete 100.0, потому что мы хотим дать пользователю сообщение только в том случае, если он получил достижение, а не в том случае, если он получает 50% от достижения.
Если это правда, мы показываем пользователю, что он заработал достижение, с представлением предупреждений. Мы установили делегат на ноль этого вида оповещения, потому что он нам не нужен, мы используем только кнопку отмены.

Если в ach была ошибка или ничего не было сохранено, вы можете дать пользователю сообщение о том, что отправка достижения не удалась, но я оставляю его с комментарием.

Построить и запустить, чтобы закончить учебник. Чтобы проверить, работают ли кнопка сброса и просмотр предупреждений, нажмите кнопку «Сбросить достижения и оценку». Затем увеличьте счет, и должно появиться окно с предупреждением.

Заработанное достижение

Если вы заработали и достижения, и закрыли приложение, и удалили if из панели многозадачности, currentScore снова устанавливается в 0, потому что мы не сохранили это значение. Если вы увеличиваете счет или приложение думает, что вы снова заработали достижение «1 касание», но вы уже заработали его. Если вы хотите, чтобы это произошло, вы можете сохранить значение currentScore.

Спасибо за чтение этого урока о Game Center. Если у вас есть вопросы или комментарии к этому учебнику, оставьте их в разделе комментариев ниже или напишите мне по адресу [email protected]