Panduan ini menunjukkan cara menyimpan dan memuat data progres game pemain menggunakan layanan {i>Saved Games<i} dalam aplikasi C++. Anda dapat menggunakan layanan untuk otomatis memuat dan menyimpan progres game pemain kapan saja selama bermain game. Layanan ini juga dapat memungkinkan pemain untuk memicu pengguna antarmuka 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 Save Games API:
- Instal SDK Play Game C++.
- Menyiapkan lingkungan pengembangan C++ Anda.
- Download dan tinjau contoh kode C++.
- Aktifkan layanan Game Tersimpan di Konsol Google Play.
Format data dan kompatibilitas lintas platform
Data Game tersimpan yang Anda simpan ke server Google harus berada di
Format std::vector<uint8_t>
. Layanan Game Tersimpan menangani encoding
data Anda untuk kompatibilitas lintas platform; Aplikasi Android dapat membaca di
data yang sama seperti sebuah larik byte tanpa
masalah kompatibilitas lintas platform.
Hindari penggunaan format khusus platform saat memilih format data untuk Data Game tersimpan. Kami sangat menyarankan Anda untuk menggunakan format data, seperti XML atau JSON, yang memiliki dukungan library yang kuat di berbagai platform.
Mengaktifkan layanan Game Tersimpan
Sebelum dapat menggunakan layanan Game Tersimpan, Anda harus mengaktifkan akses terlebih dahulu ke
anotasi. Untuk melakukannya, panggil EnableSnapshots()
saat Anda membuat layanan dengan
gpg::GameServices::Builder
. Tindakan ini akan mengaktifkan cakupan autentikasi tambahan
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. Jika pemain memilih opsi ini, game Anda harus membawa layar yang menampilkan slot simpan yang ada, dan memungkinkan pemain untuk menyimpan atau memuat dari salah satu slot ini, atau membuat game tersimpan yang baru. Gunakan berikut untuk melakukannya:
SnapshotManager::ShowSelectUIOperation(...)
UI pilihan Game Tersimpan memungkinkan untuk membuat game tersimpan baru, melihat detail tentang game tersimpan yang sudah ada, dan memuat game yang disimpan 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 menampilkan 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 dimiliki pengguna
dibuat, UI Snapshot default menyediakan tombol kepada pemain untuk membuat
menyimpan game, dan bukan memilih game 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 terlebih dahulu
objek SnapshotMetadata
yang mewakili game tersimpan tersebut. Selanjutnya, panggil metode
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 mendeteksi
apakah ada game tersimpan yang bentrok. Konflik data dapat terjadi saat
game yang disimpan di perangkat lokal pemain tidak sinkron dengan versi jarak jauh
disimpan di server Google.
Kebijakan konflik yang Anda tentukan saat membuka game tersimpan akan memberi tahu tab Disimpan Layanan game cara menyelesaikan konflik data secara otomatis. Kebijakan ini bisa berupa salah satu hal berikut:
Kebijakan Konflik | Deskripsi |
---|---|
SnapshotConflictPolicy::MANUAL |
Menunjukkan bahwa layanan Game Tersimpan tidak boleh melakukan tindakan resolusi. Sebagai gantinya, game Anda akan menjalankan penggabungan kustom. |
SnapshotConflictPolicy::LONGEST_PLAYTIME |
Menunjukkan layanan Game Tersimpan harus memilih game tersimpan dengan nilai waktu bermain terbesar. |
SnapshotConflictPolicy::BASE_WINS |
Menunjukkan layanan Game Tersimpan harus memilih basis game tersimpan. |
SnapshotConflictPolicy::REMOTE_WINS |
Menunjukkan layanan Game Tersimpan harus memilih remote game tersimpan. Versi jarak jauh adalah versi yang disimpan game yang terdeteksi di salah satu perangkat pemain dan memiliki versi {i>stempel waktu<i} dibandingkan versi dasar. |
Jika Anda menentukan kebijakan konflik selain GPGSnapshotConflictPolicyManual
,
layanan Game Tersimpan akan menggabungkan game tersimpan dan menampilkan versi yang diperbarui
melalui nilai SnapshotManager::OpenResponse
yang dihasilkan. Game Anda dapat membuka
game tersimpan, tulis ke dalamnya, lalu panggil SnapshotManager::Commit(...)
untuk meng-commit game tersimpan ke server Google.
Melakukan penggabungan kustom
Jika Anda menentukan SnapshotConflictPolicy::MANUAL
sebagai kebijakan konflik,
game Anda harus menyelesaikan konflik data apa pun yang terdeteksi sebelum melanjutkan
operasi baca atau tulis di game tersimpan.
Dalam hal ini, saat konflik data terdeteksi, layanan akan menampilkan
parameter berikut hingga SnapshotManager::OpenResponse
:
conflict_id
untuk mengidentifikasi konflik ini secara unik (Anda akan menggunakan nilai ini saat melakukan commit versi akhir game tersimpan);- Versi dasar game tersimpan yang mengalami konflik; dan,
- Versi jarak jauh game tersimpan yang mengalami konflik.
Game Anda harus menentukan data yang akan disimpan, lalu memanggil
Metode SnapshotManager::ResolveConflictBlocking()
untuk meng-commit/menyelesaikan final
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, pertama-tama buka objek SnapshotMetadata
yang mewakili
menyimpan game tersebut, menyelesaikan konflik data yang terdeteksi, lalu memanggil
Metode SnapshotManager::Commit()
untuk meng-commit metode yang disimpan
perubahan permainan.
Contoh berikut menunjukkan cara membuat perubahan dan melakukan commit game tersimpan.
Pertama, buka {i>snapshot<i} yang ingin kita edit, dan pastikan semua konflik telah 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 } });
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();
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 yang dimainkan dan deskripsi game tersimpan.
Jika operasi commit berhasil diselesaikan, pemain dapat melihat game tersimpan di UI pilihan Game Tersimpan.