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

Google Play games Services C++ SDK предоставляет API C++ для использования с игровыми сервисами 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 управляет их жизненным циклом. Ваш клиент никогда не должен держать ссылку на менеджера. Вместо этого ваш клиент должен удерживать экземпляр 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 .