Pierwsze kroki z usługami gier Play w C++

Pakiet SDK usług Google Play dla gier w C++ zawiera interfejs API C++ do wykorzystania w usługach gier Google Play. Jest przeznaczony dla deweloperów, którzy mają przygotowaną grę w C++.

Obecnie pakiet SDK stosuje te usługi:

  • Upoważnienie
  • Osiągnięcia
  • Tabele wyników
  • Zdarzenia
  • Zapisane gry
  • Połączenia w pobliżu (tylko Android)
  • Statystyki gracza

Pojęcia

Aby korzystać z pakietu SDK, wykonaj te czynności:

  1. Ustaw platformę dla Androida.
  2. Użyj GameServices::Builder, aby skonfigurować i utworzyć obiekt GameServices. Obiekt GameServices automatycznie próbuje się zalogować i zwraca wynik przez wywołanie zwrotne OnAuthActionFinished(). Zwróć uwagę na wynik zwrócony przez wywołanie zwrotne. Jeśli próba automatycznego logowania się nie powiedzie, możesz wyświetlić przycisk umożliwiający użytkownikom logowanie się.
  3. Po otrzymaniu wyniku OnAuthActionFinished() możesz używać obiektu GameServices i jego menedżerów podrzędnych do wywoływania usług Gier Play, takich jak:

    • Zaloguj się (po nieudanej autoryzacji): StartAuthorizationUI()
    • Odblokuj osiągnięcia: Achievements().Unlock()
    • Pokazuj osiągnięcia za pomocą wbudowanego interfejsu: Achievements().ShowAllUI()
    • Prześlij wysoki wynik: Leaderboards().SubmitScore()
    • Wyloguj się: SignOut()
  4. Gdy skończysz używać obiektu GameServices, zresetuj go lub zniszcz.

Bardziej szczegółowe:

  1. Inicjowanie konfiguracji platformy: ten obiekt zawiera informacje o inicjowaniu specyficznym dla platformy. Na urządzeniu z Androidem konfiguracja platformy obejmuje maszynę wirtualną Java i wskaźnik bieżącego działania 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. Utwórz obiekt GameServices: jest to główny punkt wejścia funkcji usług gier Google Play. GameServices instancji jest tworzonych za pomocą GameServices::Builder.

    W większości wdrożeń dany obiekt GameServices będzie przechowywany tak długo, jak działa środowisko C. Nie musisz tego inicjować ponownie po wstrzymaniu i ponownym uruchomieniu Androida Activity.

    // 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. Aby zarządzać obiektem GameServices, użyj klas menedżera. Dostęp do menedżerów jest możliwy z poziomu instancji GameServices i funkcji powiązanych z grupą. Do przykładów należą menedżery osiągnięć i tabel wyników. Nie zawierają one stanu widocznego dla użytkownika. Menedżerowie są odsyłani przez odwołanie, a ich cykl życia kontroluje GameServices instancja. Klient nie powinien nigdy korzystać z odwołania do menedżera. Zamiast tego klient powinien pozostać w instancji GameServices.

    Menedżerowie zwracają dane za pomocą obiektów o stałej wartości. Wartości te odzwierciedlają spójny widok danych podstawowych w momencie wykonywania zapytania.

    // Submit a high score
    game_services_->Leaderboards().SubmitScore(leaderboard_id, score);
    
    // Show the default Achievements UI
    game_services_->Achievements().ShowAllUI();
    
  4. Gdy skończysz używać obiektu GameServices, wyczyść dane, wywołując metodę reset() na obiekcie unique_ptr, do którego jest ona przypisana, lub pozwalając unique_ptr na automatyczne zniszczenie jej poza zakresem.

Model z wątkami

O ile nie wskazano inaczej, wszystkie metody GameServices i Menedżera mają implementacje asynchroniczne i bezpieczne dla wątków. Mogą być wywoływane w dowolnym wątku bez blokowania zewnętrznych i wykonywane w kolejności zgodnej z kolejnością wywoływania.

Metody dostępu (te, które są odczytywane) występują w 2 głównych wariantach. Pierwszy typ metody (z nazwami takimi jak FetchProperty()) asynchronicznie przekazuje wyniki do podanego wywołania zwrotnego, a drugi (z nazwami takimi jak FetchPropertyBlocking()) synchronicznie zwraca wyniki w wątku wywołania.

// 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);});

Wszystkie wywołania zwrotne użytkownika są wywoływane w dedykowanym wątku wywołania zwrotnego. Ten wątek potencjalnie różni się od dowolnej koncepcji platformy „głównym wątkiem” lub „wątkiem UI”. Musisz też zadbać o to, aby wywołania zwrotne użytkownika były wykonywane szybko; opóźniony wątek wywołań może powodować problemy widoczne dla użytkowników (np. opóźnione zakończenie żądania wylogowania).

Informacje o konkretnej platformie

Aby zacząć korzystać z pakietu SDK G+ Play do gier na Androida, przeczytaj krótki przewodnik.

Więcej informacji

Więcej informacji znajdziesz w dokumentacji klasy zawartej w pakiecie SDK usług gier Google Play w C++ oraz w przykładach pokazujących, jak używać pakietu SDK.

Jeśli gra korzysta z serwera backendu, zobacz Włączanie dostępu po stronie serwera do usług gier Google Play.