Начало работы с игровыми сервисами Play для C++

SDK Google Play games Services C++ предоставляет C++ API для использования с игровыми сервисами Google Play и предназначен для разработчиков, у которых уже есть реализация C++ их игры.

На данный момент SDK реализует следующие сервисы:

  • Авторизация
  • Достижения
  • Таблицы лидеров
  • События
  • Сохраненные игры
  • Подключения поблизости (только для Android)
  • Статистика игрока

Концепции

На высоком уровне вы используете SDK, выполнив следующие действия:

  1. Настройте конфигурацию платформы для Android.
  2. Используйте GameServices::Builder для настройки и создания объекта GameServices . Объект GameServices автоматически пытается войти в систему и возвращает результат посредством обратного вызова OnAuthActionFinished() . Обратите внимание на результат, возвращаемый обратным вызовом. Если попытка автоматического входа не удалась, вы можете отобразить кнопку, позволяющую пользователям войти в систему.
  3. После получения результата OnAuthActionFinished() вы можете использовать объект GameServices и его дочерние менеджеры для выполнения вызовов служб Play Games, в том числе:

    • Вход в систему (после неудачной авторизации): StartAuthorizationUI()
    • Разблокировать достижения: Achievements().Unlock()
    • Показать достижения с помощью встроенного пользовательского интерфейса: Achievements().ShowAllUI()
    • Отправьте высокий балл: Leaderboards().SubmitScore()
    • Выйти: SignOut()
  4. Когда вы закончите использовать объект GameServices , сбросьте или уничтожьте его.

На более детальном уровне:

  1. Инициализировать конфигурацию платформы. Это объект, содержащий информацию об инициализации, специфичную для платформы. В Android конфигурация платформы содержит виртуальную машину Java и указатель на текущую Activity :

    // In android_main(), create a platform configuration
    // and bind the object activity.
    // Alternately, attach the activity in JNI_Onload().
    gpg::AndroidPlatformConfiguration platform_configuration;
    platform_configuration.SetActivity(state->activity->clazz);
    
  2. Создайте объект GameServices . Этот объект является основной точкой входа для функциональных возможностей игровых сервисов Google Play. Экземпляры GameServices создаются с помощью GameServices::Builder .

    В большинстве реализаций данный объект GameServices будет сохраняться до тех пор, пока сохраняется ваша среда C; вам не нужно повторно инициализировать его, когда Activity Android приостанавливается и возобновляется.

    // Creates a GameServices object that has lambda callbacks.
    game_services_ = gpg::GameServices::Builder()
            .SetDefaultOnLog(gpg::LogLevel::VERBOSE)
            .SetOnAuthActionStarted([started_callback](gpg::AuthOperation op) {
                is_auth_in_progress_ = true;
                started_callback(op);
            })
            .SetOnAuthActionFinished([finished_callback](gpg::AuthOperation op,
                                                         gpg::AuthStatus status) {
                LOGI("Sign in finished with a result of %d", status);
                is_auth_in_progress_ = false;
                finished_callback(op, status);
            })
            .Create(pc);
    
  3. Используйте классы Manager для управления вашим объектом GameServices . Доступ к менеджерам осуществляется из экземпляра GameServices , а связанные с ними функциональные возможности группируются вместе. Примерами могут служить менеджеры достижений и таблицы лидеров. Они сами не содержат видимого пользователю состояния. Менеджеры возвращаются по ссылке, а содержащий их экземпляр GameServices управляет их жизненным циклом. Ваш клиент никогда не должен хранить ссылку Manager. Вместо этого ваш клиент должен сохранить экземпляр GameServices .

    Менеджеры возвращают данные через объекты неизменяемого типа значения. Эти значения отражают согласованное представление базовых данных на момент выполнения запроса.

    // Submit a high score
    game_services_->Leaderboards().SubmitScore(leaderboard_id, score);
    
    // Show the default Achievements UI
    game_services_->Achievements().ShowAllUI();
    
  4. Когда вы закончите использовать объект GameServices , выполните очистку, вызвав reset() для unique_ptr , которому он принадлежит, или позволив unique_ptr автоматически уничтожить его при выходе за пределы области видимости.

Модель резьбы

Если не указано иное, все методы GameServices и Manager имеют поточно-ориентированную асинхронную реализацию. Их можно вызывать в любом потоке без внешней блокировки, и они будут выполняться в порядке, соответствующем порядку их вызова.

Методы доступа (те, которые читают состояние) бывают двух основных вариантов. Метод первого типа (с такими именами, как FetchProperty() ) асинхронно передает свои результаты в предоставленный обратный вызов; второй (с такими именами, как FetchPropertyBlocking() ) синхронно возвращает свои результаты вызывающему потоку.

// Blocking callback
gpg::AchievementManager::FetchAllResponse fetchResponse =
        game_services_->Achievements().FetchAllBlocking(std::chrono::milliseconds(1000));

// Non-blocking callback
game_services_->Achievements().FetchAll(gpg::DataSource::CACHE_OR_NETWORK,
    [] (gpg::AchievementManager::FetchAllResponse response) {
    LogI("Achievement response status: %d", response.status);});

Все пользовательские обратные вызовы вызываются в выделенном потоке обратного вызова. Этот поток потенциально отличается от любой концепции платформы «основной поток» или «поток пользовательского интерфейса». Вам также следует постараться обеспечить быстрое выполнение обратных вызовов пользователя; остановленный поток обратного вызова может вызвать проблемы, видимые пользователем (например, задержку завершения запроса на выход).

Информация для конкретной платформы

Чтобы начать использовать Play Games C++ SDK на Android, перейдите к краткому руководству .

Дальнейшее чтение

Обязательно прочтите документацию по классу, которая входит в состав SDK C++ для игровых сервисов Google Play, для получения более подробной информации, а также ознакомьтесь с примерами , демонстрирующими, как использовать SDK.

Если ваша игра использует внутренний сервер, см. раздел «Включение серверного доступа к игровым сервисам Google Play» .