Gespeicherte Spiele zu einem Spiel hinzufügen

In dieser Anleitung erfahren Sie, wie Sie die Spielfortschrittsdaten eines Spielers den Dienst „Saved Games“ in einer C++ App auf. Sie können diese Dienst, mit dem der Spielfortschritt jederzeit automatisch geladen und gespeichert wird während des Spiels. Dieser Dienst kann Spielern auch das Auslösen eines Nutzers ermöglichen um vorhandene gespeicherte Spielstände zu aktualisieren oder wiederherzustellen oder einen neuen zu erstellen.

Hinweis

Falls Sie dies noch nicht getan haben, kann es hilfreich sein, sich die Konzepte für „Gespeicherte Spiele“

Bevor Sie mit dem Programmieren mit der Saved Games API beginnen:

Datenformate und plattformübergreifende Kompatibilität

Daten zu gespeicherten Spielen, die Sie auf den Google-Servern speichern, müssen sich in folgendem Land befinden: std::vector<uint8_t>-Format. Der Dienst „Saved Games“ übernimmt die Codierung. Ihre Daten für plattformübergreifende Kompatibilität Android-Apps können Daten dieselben Daten wie ein Byte-Array ohne plattformübergreifende Kompatibilitätsprobleme.

Vermeiden Sie die Verwendung plattformspezifischer Formate bei der Auswahl eines Datenformats für Ihr Daten gespeichert. Wir empfehlen Ihnen dringend, ein Datenformat wie XML oder JSON, die zahlreiche Bibliotheken auf mehreren Plattformen unterstützen.

Dienst "Gespeicherte Spiele" aktivieren

Bevor du den Dienst "Gespeicherte Spiele" verwenden kannst, musst du den Zugriff auf . Rufen Sie dazu EnableSnapshots() auf, wenn Sie den Dienst mit gpg::GameServices::Builder. Dadurch werden die zusätzlichen Authentifizierungsbereiche aktiviert. für gespeicherte Spiele beim nächsten Authentifizierungsereignis erforderlich.

Gespeicherte Spiele anzeigen

In Ihrem Spiel können Sie eine Option anbieten, über die Spieler das Speichern oder kannst du gespeicherte Spiele wiederherstellen. Wenn Spieler diese Option auswählen, sollte Bildschirm, auf dem vorhandene Spielstände angezeigt werden, und es Spielern ermöglicht, entweder in einer dieser Slots speichern oder laden oder ein neues gespeichertes Spiel erstellen. Verwenden Sie die Methode mit der folgenden Methode verwenden:

  SnapshotManager::ShowSelectUIOperation(...)

Über die Benutzeroberfläche zur Auswahl gespeicherter Spiele können Spieler ein neues gespeichertes Spiel erstellen, Details zu vorhandenen gespeicherten Spielen abrufen und lade frühere gespeicherte Spiele.

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

Das folgende Beispiel zeigt, wie die Standardbenutzeroberfläche für gespeicherte Spiele aufgerufen wird. und die Auswahl der Benutzeroberfläche des Players anpassen:

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

Wenn im obigen Beispiel ALLOW_CREATE_SNAPSHOT gleich true und MAX_SNAPSHOTS ist ist größer als die aktuelle Anzahl der Snapshots des Nutzers steht in der standardmäßigen Snapshot-Benutzeroberfläche eine Schaltfläche zum Erstellen eines neuen statt ein vorhandenes Spiel zu speichern. (Wenn die Schaltfläche befindet sich unten auf der Benutzeroberfläche.) Wenn ein Spieler auf diese Schaltfläche klickt, Die Antwort SnapshotSelectUIResponse ist gültig, enthält aber keine Daten.

Gespeicherte Spiele öffnen und lesen

Wenn du auf ein gespeichertes Spiel zugreifen und dessen Inhalte lesen oder ändern möchtest, öffne zuerst Das SnapshotMetadata-Objekt, das das gespeicherte Spiel darstellt. Rufen Sie als Nächstes die Methode SnapshotManager::Read*()-Methode.

Das folgende Beispiel zeigt, wie ein gespeichertes Spiel geöffnet wird:

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

Datenkonflikte erkennen und beheben

Wenn Sie ein SnapshotMetadata-Objekt öffnen, erkennt der Dienst „Gespeicherte Spiele“ ob ein in Konflikt stehendes gespeichertes Spiel existiert. Datenkonflikte können auftreten, wenn die gespeicherten Das auf dem lokalen Gerät eines Spielers gespeicherte Spiel ist nicht mit der Remote-Version synchron. die auf den Servern von Google gespeichert sind.

Die Konfliktrichtlinie, die du beim Öffnen eines gespeicherten Spiels angibst, Games-Dienst, der zeigt, wie ein Datenkonflikt automatisch gelöst wird. Folgende Richtlinien sind möglich:

Konfliktrichtlinie Beschreibung
SnapshotConflictPolicy::MANUAL Gibt an, dass der Dienst "Gespeicherte Spiele" keine zur Problembehebung. Stattdessen findet Ihr Spiel eine benutzerdefinierte Zusammenführung
SnapshotConflictPolicy::LONGEST_PLAYTIME Gibt an, dass der Dienst "Gespeicherte Spiele" die mit der höchsten Spielzeit.
SnapshotConflictPolicy::BASE_WINS Gibt an, dass der Dienst „Gespeicherte Spiele“ die Basis verwenden soll gespeichertes Spiel.
SnapshotConflictPolicy::REMOTE_WINS Gibt an, dass der Dienst „Gespeicherte Spiele“ die Fernbedienung auswählen soll gespeichertes Spiel. Die Remote-Version ist eine Version der gespeicherten Spiel, das auf einem der Geräte des Spielers erkannt wird und eine neuere als die Basisversion.

Wenn Sie eine andere Konfliktrichtlinie als GPGSnapshotConflictPolicyManual angegeben haben, Der Dienst „Gespeicherte Spiele“ führt das gespeicherte Spiel zusammen und gibt die aktualisierte Version zurück durch den sich daraus ergebenden SnapshotManager::OpenResponse-Wert. Dein Spiel kann geöffnet werden das gespeicherte Spiel, schreiben Sie es und rufen Sie dann SnapshotManager::Commit(...) um das gespeicherte Spiel auf den Google-Servern zu speichern.

Benutzerdefinierte Zusammenführung durchführen

Wenn Sie SnapshotConflictPolicy::MANUAL als Konfliktrichtlinie angegeben haben, Dein Spiel muss alle erkannten Datenkonflikte beheben, bevor du weitere Spiele ausführen kannst Lese- oder Schreibvorgänge im gespeicherten Spiel.

Wenn in diesem Fall ein Datenkonflikt erkannt wird, gibt der Dienst den Fehlercode folgende Parameter bis SnapshotManager::OpenResponse:

  • Ein conflict_id zur eindeutigen Identifizierung dieses Konflikts. Dieser Wert wird von Ihnen verwendet. wenn die endgültige Version des gespeicherten Spiels übernommen wird.
  • Die in Konflikt stehende Basisversion des gespeicherten Spiels und
  • Die in Konflikt stehende Remote-Version des gespeicherten Spiels.

Ihr Spiel muss entscheiden, welche Daten gespeichert werden sollen, und dann die Methode SnapshotManager::ResolveConflictBlocking()-Methode für einen Commit/Auflösen des endgültigen Ergebnisses auf die Server von Google.

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

Gespeicherte Spiele schreiben

Um ein gespeichertes Spiel zu schreiben, öffne zuerst das SnapshotMetadata-Objekt, das für die das gespeicherte Spiel öffnen, erkannte Datenkonflikte lösen und dann die SnapshotManager::Commit()-Methode, um Ihre gespeicherten bahnbrechende Änderungen.

Das folgende Beispiel zeigt, wie Sie eine Änderung erstellen und einen Commit für eine gespeichertes Spiel.

  1. Öffnen Sie zuerst den Snapshot, den Sie bearbeiten möchten, und stellen Sie sicher, dass alle Konflikte durch Auswahl der Basis gelöst werden kann.

    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. Erstellen Sie als Nächstes eine Spieländerung, die die für die Titelbild:

    gpg::SnapshotMetadataChange::Builder builder;
    gpg::SnapshotMetadataChange metadata_change =
        builder.SetDescription("CollectAllTheStar savedata")
                 .SetCoverImageFromPngData(pngData).Create();
    
  3. Führen Sie abschließend einen Commit der gespeicherten Spieländerungen durch.

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

    Der Parameter data enthält alle gespeicherten Spieldaten. Die Änderung enthält auch zusätzliche Metadaten zum gespeicherten Spiel, z. B. die Zeit gespielt haben, sowie eine Beschreibung für das gespeicherte Spiel.

Wenn der Commit-Vorgang erfolgreich abgeschlossen wurde, können Spieler Folgendes sehen: das gespeicherte Spiel auf der Benutzeroberfläche zur Auswahl gespeicherter Spiele.