Po wycofaniu interfejsu Google Sign-In
API w 2026 roku usuniemy pakiet SDK dla gier w wersji 1. Z końcem lutego 2025 r. nie będzie już można publikować w Google Play nowych tytułów, w których zastosowano integrację z wersją 1 pakietu SDK dla gier. Zamiast tego zalecamy używanie pakietu SDK dla gier w wersji 2.
Dotychczasowe tytuły z integracjami gier w wersji 1 będą działać jeszcze przez kilka lat, ale zachęcamy do przejścia na wersję 2 od czerwca 2025 r.
Ten przewodnik dotyczy korzystania z pakietu SDK dla usług gier Play w wersji 1. Pakiet C++ SDK dla usług gier Play w wersji 2 nie jest jeszcze dostępny.
Z tego przewodnika dowiesz się, jak zapisywać i wczytywać dane o postępach gracza w grze za pomocą usługi Zapisane gry w aplikacji w języku C++. Za pomocą tej usługi możesz automatycznie wczytywać i zapisywać postępy gracza w dowolnym momencie rozgrywki. Ta usługa może też umożliwiać graczom wywoływanie interfejsu użytkownika w celu zaktualizowania lub przywrócenia istniejącego zapisu gry albo utworzenia nowego.
Zanim zaczniesz
Jeśli jeszcze tego nie zrobiono, warto zapoznać się z pojęciami dotyczącymi zapisanych gier.
Zanim zaczniesz pisać kod przy użyciu interfejsu Saved Games API:
- Zainstaluj pakiet SDK C++ do Gier Play.
- Skonfiguruj środowisko programistyczne C++.
- Pobierz i przejrzyj przykładowy kod w C++.
- Włącz usługę Zapisane gry w Konsoli Google Play.
Formaty danych i zgodność z różnymi platformami
Dane zapisanych gier, które zapisujesz na serwerach Google, muszą być w formacie std::vector<uint8_t>. Usługa zapisanych gier dba o kodowanie danych pod kątem zgodności z różnymi platformami. Aplikacje na Androida mogą odczytywać te same dane jako tablicę bajtów bez żadnych problemów ze zgodnością z różnymi platformami.
Wybierając format danych zapisanych gier, unikaj formatów specyficznych dla platformy. Zdecydowanie zalecamy używanie formatu danych, takiego jak XML lub JSON, który jest dobrze obsługiwany przez biblioteki na różnych platformach.
Włączanie usługi zapisanych gier
Zanim zaczniesz korzystać z usługi Zapisane gry, musisz najpierw włączyć do niej dostęp. Aby to zrobić, wywołaj EnableSnapshots() podczas tworzenia usługi za pomocą
gpg::GameServices::Builder. Podczas następnego zdarzenia autoryzacji zostaną włączone dodatkowe zakresy autoryzacji
wymagane przez zapisane gry.
Wyświetlanie zapisanych gier
W grze możesz udostępnić opcję, którą gracze mogą włączyć, aby zapisać lub przywrócić zapisane gry. Gdy gracze wybiorą tę opcję, gra powinna wyświetlić ekran z istniejącymi miejscami zapisu i umożliwić zapisanie lub wczytanie gry w jednym z nich albo utworzenie nowej zapisanej gry. Aby to zrobić, użyj tej metody:
SnapshotManager::ShowSelectUIOperation(...)
Interfejs wyboru zapisanych gier umożliwia graczom tworzenie nowych zapisanych gier, wyświetlanie szczegółów istniejących zapisanych gier i wczytywanie poprzednich zapisanych gier.
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);
}
Poniższy przykład pokazuje, jak wyświetlić domyślny interfejs Zapisanych gier i obsłużyć wybór 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 wartość ALLOW_CREATE_SNAPSHOT jest równa true, a wartość MAX_SNAPSHOTS jest większa niż rzeczywista liczba zrzutów, które użytkownik utworzył do tej pory, domyślny interfejs zrzutów udostępnia graczom przycisk do utworzenia nowej gry zapisanej zamiast wyboru istniejącej. (Gdy przycisk jest wyświetlany, znajduje się u dołu interfejsu). Gdy gracz kliknie ten przycisk, odpowiedź SnapshotSelectUIResponse jest prawidłowa, ale nie zawiera danych.
Otwieranie i odczytywanie zapisanych gier
Aby uzyskać dostęp do zapisanej gry i odczytać lub zmodyfikować jej zawartość, najpierw otwórz obiekt SnapshotMetadata reprezentujący tę zapisaną grę. Następnie wywołaj metodę SnapshotManager::Read*().
Poniższy przykład pokazuje, jak otworzyć zapisaną grę:
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 sprawdzi, czy istnieje konfliktujący zapis gry. Konflikty danych mogą wystąpić, gdy zapisana gra przechowywana na urządzeniu lokalnym gracza jest niezsynchronizowana z wersją zdalną przechowywaną na serwerach Google.
Zasady dotyczące konfliktów, które określasz podczas otwierania zapisanej gry, informują usługę Zapisane gry, jak automatycznie rozwiązywać konflikty 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ń związanych z rozwiązywaniem problemów. Zamiast tego gra wykona niestandardowe scalanie. |
SnapshotConflictPolicy::LONGEST_PLAYTIME |
Wskazuje, że usługa Zapisane gry powinna wybrać zapisaną grę z najdłuższym czasem gry. |
SnapshotConflictPolicy::BASE_WINS |
Wskazuje, że usługa Zapisane gry powinna wybrać podstawowy zapisany stan gry. |
SnapshotConflictPolicy::REMOTE_WINS |
Wskazuje, że usługa Zapisane gry powinna wybrać zdany zapis gry. Wersja zdalna to wersja zapisanej gry wykryta na jednym z urządzeń gracza, która ma nowszy sygnaturę czasową niż wersja podstawowa. |
Jeśli podasz zasadę konfliktu inną niż GPGSnapshotConflictPolicyManual, usługa Zapisane gry scali zapisaną grę i zwróci zaktualizowaną wersję w wynikowej wartości SnapshotManager::OpenResponse. Gra może otworzyć zapisaną grę, zapisać w niej dane, a następnie wywołać metodę SnapshotManager::Commit(...)
, aby zapisać grę na serwerach Google.
Przeprowadzanie niestandardowego scalania
Jeśli jako zasadę rozwiązywania konfliktów podasz SnapshotConflictPolicy::MANUAL, gra musi rozwiązać każdy wykryty konflikt danych, zanim wykona dalsze operacje odczytu lub zapisu w zapisanej grze.
W takim przypadku, gdy usługa wykryje konflikt danych, zwraca te parametry za pomocą SnapshotManager::OpenResponse:
conflict_id– unikalny identyfikator tego konfliktu (użyjesz tej wartości podczas zatwierdzania ostatecznej wersji zapisanej gry);- sprzeczna wersja podstawowa zapisu gry;
- Sprzeczna zdalna wersja zapisu gry.
Gra musi zdecydować, jakie dane zapisać, a następnie wywołać metodę SnapshotManager::ResolveConflictBlocking(), aby przesłać/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ć grę, najpierw otwórz obiekt SnapshotMetadata reprezentujący zapisany stan gry, rozwiąż wykryte konflikty danych, a potem wywołaj metodę SnapshotManager::Commit(), aby zatwierdzić zmiany w zapisanej grze.
Poniższy przykład pokazuje, jak utworzyć zmianę i zatwierdzić zapisaną grę.
Najpierw otwórz migawkę, którą 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 } });Następnie utwórz zmianę zapisu gry, która zawiera dane obrazu używane na potrzeby obrazu okładki:
gpg::SnapshotMetadataChange::Builder builder; gpg::SnapshotMetadataChange metadata_change = builder.SetDescription("CollectAllTheStar savedata") .SetCoverImageFromPngData(pngData).Create();Na koniec zatwierdź zapisane zmiany w grze.
gpg::SnapshotManager::CommitResponse commitResponse = service_->Snapshots().CommitBlocking(metadata, metadata_change, SetupSnapshotData());Parametr danych zawiera wszystkie przechowywane dane zapisu stanu gry. Zmiana zawiera też dodatkowe metadane zapisu stanu gry, takie jak czas gry i opis zapisu stanu gry.
Jeśli operacja zatwierdzenia się powiedzie, gracze zobaczą zapisaną grę w interfejsie wyboru zapisanych gier.