Dodawanie zapisanych gier do gry

Z tego przewodnika dowiesz się, jak zapisywać i wczytywać dane postępów gracza za pomocą usługi Zapisane gry w aplikacji C++. Za pomocą tej usługi możesz automatycznie wczytywać i zapisywać postępy w grze w dowolnym momencie rozgrywki. Usługa może też umożliwiać graczom wywołanie interfejsu użytkownika w celu zaktualizowania lub przywrócenia istniejącego zapisu gry lub utworzenia nowego.

Zanim zaczniesz

Jeśli jeszcze tego nie zrobisz, warto zapoznać się z koncepcjami dotyczącymi zapisanych gier.

Zanim zaczniesz kodować przy użyciu interfejsu Saved Games API:

Formaty danych i zgodność między platformami

Zapisane dane gier, które zapisujesz na serwerach Google, muszą być w formacie std::vector<uint8_t>. Usługa Zapisane gry zajmuje się kodowaniem danych w celu zapewnienia zgodności między platformami. Aplikacje na Androida mogą odczytać te same dane jako tablicę bajtów bez żadnych problemów z zgodnością między platformami.

Wybierając format danych zapisanych gier, unikaj formatów specyficznych dla platform. Zdecydowanie zalecamy używanie formatu danych, np. XML lub JSON, który jest dobrze obsługiwany przez biblioteki na wielu platformach.

Włącz usługę Zapisanych gier

Aby móc korzystać z usługi Zapisane gry, musisz najpierw włączyć do niej dostęp. Aby to zrobić, wywołaj funkcję EnableSnapshots() podczas tworzenia usługi za pomocą funkcji gpg::GameServices::Builder. Umożliwi to użycie dodatkowych zakresów autoryzacji wymaganych przez Zapisane gry podczas następnego zdarzenia autoryzacji.

Wyświetlanie zapisanych gier

W grze możesz udostępnić opcję, która umożliwia graczom zapisywanie i przywracanie zapisanych gier. Gdy gracze wybiorą tę opcję, gra powinna wyświetlić ekran z dotychczasowymi slotami zapisu i umożliwić im zapisanie lub załadowanie gry z jednego z tych slotów albo utworzenie nowego zapisu gry. Aby to zrobić, wykonaj te czynności:

  SnapshotManager::ShowSelectUIOperation(...)

Interfejs wyboru zapisanych gier umożliwia graczom tworzenie nowych zapisów gry, wyświetlanie szczegółów dotyczących istniejących zapisów oraz wczytywanie poprzednich zapisów.

  SnapshotManager::SnapshotSelectUIResponse response;
  if (IsSuccess(response.status)) {
  if (response.data.Valid()) {
    LogI("Description: %s", response.data.Description().c_str());
    LogI("FileName %s", response.data.FileName().c_str());
    //Opening the snapshot data
    
  } else {
    LogI("Creating new snapshot");
    
  }
} else {
  LogI("ShowSelectUIOperation returns an error %d", response.status);
}

Ten przykład pokazuje, jak wyświetlić domyślny interfejs Zapisane gry i obsługiwać wybór interfejsu użytkownika:

  service_->Snapshots().ShowSelectUIOperation(
  ALLOW_CREATE_SNAPSHOT,
  ALLOW_DELETE_SNAPSHOT,
  MAX_SNAPSHOTS,
  SNAPSHOT_UI_TITLE,
  [this](gpg::SnapshotManager::SnapshotSelectUIResponse const & response) {
  
      }

Jeśli w przykładzie powyżej ALLOW_CREATE_SNAPSHOT = true, a MAX_SNAPSHOTS jest większa niż rzeczywista liczba zrzutów, które użytkownik utworzył, domyślne UI zrzutu zawiera przycisk umożliwiający utworzenie nowego zapisu gry, a nie wybór istniejącego. (gdy jest widoczny, znajduje się na dole interfejsu). Gdy gracz kliknie ten przycisk, odpowiedź SnapshotSelectUIResponse jest prawidłowa, ale nie zawiera danych.

Otwieranie i czytanie zapisanych gier

Aby uzyskać dostęp do zapisanej gry i przeczytać lub zmodyfikować jej zawartość, najpierw otwórz obiekt SnapshotMetadata reprezentujący tę zapisaną grę. Następnie wywołaj metodę SnapshotManager::Read*().

Przykład otwierania zapisanej gry:

  LogI("Opening file");
  service_->Snapshots()
  .Open(current_snapshot_.FileName(),
               gpg::SnapshotConflictPolicy::BASE_WINS,
        [this](gpg::SnapshotManager::OpenResponse const & response) {
           LogI("Reading file");
           gpg::SnapshotManager::ReadResponse responseRead =
           service_->Snapshots().ReadBlocking(response.data);
          
        }

Wykrywanie i rozwiązywanie konfliktów danych

Gdy otworzysz obiekt SnapshotMetadata, usługa Zapisane gry wykryje, czy istnieje konflikt z zapisaną grą. Konflikty danych mogą wystąpić, gdy zapisana gra na urządzeniu lokalnym gracza jest niezsynchronizowana z wersją zapisaną na serwerach Google.

Zasady konfliktu, które określasz podczas otwierania zapisanej gry, informują usługę Zapisane gry, jak automatycznie rozwiązać konflikt danych. Zasada może mieć jedną z tych wartości:

Zasady dotyczące konfliktów Opis
SnapshotConflictPolicy::MANUAL Wskazuje, że usługa Zapisane gry nie powinna podejmować żadnych działań w celu rozwiązania problemu. Zamiast tego gra wykona niestandardowe scalanie.
SnapshotConflictPolicy::LONGEST_PLAYTIME Wskazuje, że usługa Zapisane gry powinna wybrać zapisaną grę z największą wartością czasu gry.
SnapshotConflictPolicy::BASE_WINS Wskazuje, że usługa Zapisane gry powinna wybrać podstawową zapisaną grę.
SnapshotConflictPolicy::REMOTE_WINS Wskazuje, że usługa Zapisane gry powinna wybrać zapisaną grę z dalszego komputera. Wersja zdalna to wersja zapisanej gry wykrywana na jednym z urządzeń gracza i mająca nowszy sygnaturę czasową niż wersja podstawowa.

Jeśli określona zasada konfliktu jest inna niż GPGSnapshotConflictPolicyManual, usługa Zapisane gry scali zapisane gry i zwróci zaktualizowaną wersję za pomocą wartości SnapshotManager::OpenResponse. Gra może otworzyć zapisaną grę, zapisać w niej dane, a następnie wywołać metodę SnapshotManager::Commit(...), aby zapisać zapisaną grę na serwerach Google.

Wykonywanie niestandardowego łączenia

Jeśli jako zasadę konfliktu ustawisz wartość SnapshotConflictPolicy::MANUAL, gra musi rozwiązać konflikt danych, zanim wykona dalsze operacje odczytu lub zapisu na zapisanej grze.

W takim przypadku, gdy wykryto konflikt danych, usługa zwraca te parametry za pomocą SnapshotManager::OpenResponse:

  • conflict_id, aby jednoznacznie zidentyfikować ten konflikt (użyjesz tej wartości podczas zatwierdzania ostatecznej wersji zapisanej gry);
  • sprzeczna podstawowa wersja zapisu gry;
  • Zdalny zapis gry o sprzecznej treści.

Gra musi zdecydować, jakie dane zapisać, a potem wywołać metodę SnapshotManager::ResolveConflictBlocking(), aby zatwierdzić/rozwiązać ostateczną wersję na serwerach Google.

    //Resolve conflict
    gpg::SnapshotManager::OpenResponse resolveResponse =
        manager.ResolveConflictBlocking(openResponse.conflict_base, metadata_change,
                                  openResponse.conflict_id);

zapisywanie gier,

Aby zapisać zapisaną grę, najpierw otwórz obiekt SnapshotMetadata reprezentujący tę zapisaną grę, rozwiąż wszelkie wykryte konflikty danych, a potem wywołaj metodę SnapshotManager::Commit(), aby zatwierdzić zmiany zapisanej gry.

Poniższy przykład pokazuje, jak utworzyć zmianę i zatwierdzić zapisaną grę.

  1. Najpierw otwórz zrzut ekranu, który chcesz edytować, i upewnij się, że wszystkie konflikty zostały rozwiązane przez wybranie bazy.

    service_->Snapshots().Open(
          file_name,
          gpg::SnapshotConflictPolicy::BASE_WINS,
          [this](gpg::SnapshotManager::OpenResponse const &response) {
            if (IsSuccess(response.status)) {
              // metadata : gpg::SnapshotMetadata
              metadata = response.data;
            } else {
              // Handle snapshot open error here
            }
          });
    
  2. Następnie utwórz zmianę zapisanej gry, która zawiera dane obrazu użyte do obrazu okładki:

    gpg::SnapshotMetadataChange::Builder builder;
    gpg::SnapshotMetadataChange metadata_change =
        builder.SetDescription("CollectAllTheStar savedata")
                 .SetCoverImageFromPngData(pngData).Create();
    
  3. Na koniec zatwierdź zmiany w zapisie gry.

    gpg::SnapshotManager::CommitResponse commitResponse =
        service_->Snapshots().CommitBlocking(metadata, metadata_change, SetupSnapshotData());
    

    Parametr „data” zawiera wszystkie dane zapisu gry, które są przechowywane. Zmiana zawiera również dodatkowe metadane zapisu stanu gry, takie jak czas gry i opis zapisu.

Jeśli operacja zatwierdzenia została zakończona pomyślnie, gracze mogą zobaczyć zapisaną grę w interfejsie wyboru zapisanych gier.