Menambahkan Game Tersimpan ke Game

Panduan ini menunjukkan cara menyimpan dan memuat data progres game pemain menggunakan layanan Game Tersimpan di aplikasi C++. Anda dapat menggunakan layanan ini untuk otomatis memuat dan menyimpan progres game pemain kapan saja selama gameplay. Layanan ini juga dapat memungkinkan pemain memicu antarmuka pengguna untuk mengupdate atau memulihkan game tersimpan yang ada, atau membuat game baru.

Sebelum memulai

Jika Anda belum melakukannya, sebaiknya tinjau konsep game Game Tersimpan.

Sebelum Anda mulai membuat kode menggunakan Saved Games API:

Format data dan kompatibilitas lintas platform

Data Game tersimpan yang Anda simpan ke server Google harus dalam format std::vector<uint8_t>. Layanan Game Tersimpan menangani encoding data Anda untuk kompatibilitas lintas platform; aplikasi Android dapat membaca dalam data yang sama ini sebagai array byte tanpa masalah kompatibilitas lintas platform.

Hindari penggunaan format khusus platform saat memilih format data untuk data Game Tersimpan Anda. Kami sangat menyarankan Anda untuk menggunakan format data, seperti XML atau JSON, yang memiliki dukungan library yang kuat pada beberapa platform.

Mengaktifkan layanan Game Tersimpan

Sebelum dapat menggunakan layanan Game Tersimpan, Anda harus mengaktifkan aksesnya terlebih dahulu. Untuk melakukannya, panggil EnableSnapshots() saat Anda membuat layanan dengan gpg::GameServices::Builder. Ini akan mengaktifkan cakupan autentikasi tambahan yang diperlukan oleh Game Tersimpan pada peristiwa autentikasi berikutnya.

Menampilkan Game Tersimpan

Di game, Anda dapat memberikan opsi yang dapat dipicu pemain untuk menyimpan atau memulihkan game tersimpan. Saat pemain memilih opsi ini, game Anda akan menampilkan layar yang menampilkan slot simpan yang ada, dan memungkinkan pemain menyimpan ke atau memuat dari salah satu slot ini, atau membuat game tersimpan baru. Gunakan metode berikut untuk melakukannya:

  SnapshotManager::ShowSelectUIOperation(...)

UI pilihan Game Tersimpan memungkinkan pemain membuat game tersimpan baru, melihat detail tentang game tersimpan yang ada, dan memuat game tersimpan sebelumnya.

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

Contoh berikut mengilustrasikan cara memunculkan UI Game Tersimpan default dan menangani pemilihan UI pemain:

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

Jika, dalam contoh di atas, ALLOW_CREATE_SNAPSHOT adalah true dan MAX_SNAPSHOTS lebih besar dari jumlah snapshot sebenarnya yang saat ini dibuat oleh pengguna, UI Snapshot default menyediakan tombol untuk membuat game simpan baru kepada pemain, bukan memilih yang sudah ada. (Saat ditampilkan, tombol berada di bagian bawah UI.) Saat pemain mengklik tombol ini, respons SnapshotSelectUIResponse valid tetapi tidak memiliki data.

Membuka dan membaca game tersimpan

Untuk mengakses game tersimpan dan membaca atau mengubah kontennya, buka objek SnapshotMetadata yang mewakili game tersimpan tersebut terlebih dahulu. Selanjutnya, panggil metode SnapshotManager::Read*().

Contoh berikut menunjukkan cara membuka game tersimpan:

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

Mendeteksi dan menyelesaikan konflik data

Saat Anda membuka objek SnapshotMetadata, layanan Game Tersimpan akan mendeteksi apakah game tersimpan yang mengalami konflik atau tidak. Konflik data dapat terjadi saat game tersimpan yang disimpan di perangkat lokal pemain tidak sinkron dengan versi jarak jauh yang disimpan di server Google.

Kebijakan konflik yang Anda tentukan saat membuka game tersimpan akan memberi tahu layanan Game Tersimpan cara menyelesaikan konflik data secara otomatis. Kebijakan dapat berupa salah satu dari berikut:

Kebijakan Konflik Deskripsi
SnapshotConflictPolicy::MANUAL Menunjukkan bahwa layanan Game Tersimpan tidak perlu melakukan tindakan penyelesaian. Sebagai gantinya, game Anda akan melakukan penggabungan kustom.
SnapshotConflictPolicy::LONGEST_PLAYTIME Menunjukkan bahwa layanan Game Tersimpan harus memilih game tersimpan dengan nilai waktu bermain terbesar.
SnapshotConflictPolicy::BASE_WINS Menunjukkan bahwa layanan Game Tersimpan harus memilih game tersimpan dasar.
SnapshotConflictPolicy::REMOTE_WINS Menunjukkan bahwa layanan Game Tersimpan harus memilih game tersimpan jarak jauh. Versi jarak jauh adalah versi game tersimpan yang terdeteksi di salah satu perangkat pemain dan memiliki stempel waktu yang lebih baru daripada versi dasar.

Jika Anda menentukan kebijakan konflik selain GPGSnapshotConflictPolicyManual, layanan Game Tersimpan akan menggabungkan game tersimpan dan menampilkan versi yang telah diperbarui melalui nilai SnapshotManager::OpenResponse yang dihasilkan. Game Anda dapat membuka game tersimpan, menulisnya, lalu memanggil metode SnapshotManager::Commit(...) untuk meng-commit game tersimpan ke server Google.

Melakukan penggabungan khusus

Jika Anda menentukan SnapshotConflictPolicy::MANUAL sebagai kebijakan konflik, game Anda harus menyelesaikan konflik data yang terdeteksi sebelum melakukan operasi baca atau tulis lebih lanjut pada game tersimpan.

Dalam hal ini, saat konflik data terdeteksi, layanan akan menampilkan parameter berikut melalui SnapshotManager::OpenResponse:

  • conflict_id untuk mengidentifikasi konflik ini secara unik (Anda akan menggunakan nilai ini saat menerapkan versi akhir game tersimpan);
  • Versi dasar game yang disimpan yang bertentangan; dan,
  • Versi jarak jauh dari game tersimpan.

Game Anda harus memutuskan data yang akan disimpan, lalu panggil metode SnapshotManager::ResolveConflictBlocking() untuk meng-commit/menyelesaikan versi akhir ke server Google.

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

Menulis game tersimpan

Untuk menulis game tersimpan, buka terlebih dahulu objek SnapshotMetadata yang merepresentasikan game tersimpan tersebut, selesaikan konflik data yang terdeteksi, lalu panggil metode SnapshotManager::Commit() untuk meng-commit perubahan game tersimpan Anda.

Contoh berikut menunjukkan cara membuat perubahan dan meng-commit game tersimpan.

  1. Pertama, buka snapshot yang ingin diedit, dan pastikan semua konflik diselesaikan dengan memilih basis.

    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. Selanjutnya, buat perubahan game tersimpan yang menyertakan data gambar yang digunakan untuk gambar sampul:

    gpg::SnapshotMetadataChange::Builder builder;
    gpg::SnapshotMetadataChange metadata_change =
        builder.SetDescription("CollectAllTheStar savedata")
                 .SetCoverImageFromPngData(pngData).Create();
    
  3. Terakhir, commit perubahan game tersimpan.

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

    Parameter data berisi semua data game tersimpan yang Anda simpan. Perubahan tersebut juga berisi metadata game tersimpan tambahan, seperti waktu main dan deskripsi untuk game tersimpan.

Jika operasi commit berhasil diselesaikan, pemain dapat melihat game tersimpan di UI pilihan Game Tersimpan.