Bu kılavuzda, C++ uygulamasında Saved Games hizmetini kullanarak bir oyuncunun oyundaki ilerleme verilerini nasıl kaydedip yükleyeceğiniz gösterilmektedir. Bu hizmeti, oyun sırasında herhangi bir noktada oyuncu oyunu ilerleme durumunu otomatik olarak yüklemek ve kaydetmek için kullanabilirsiniz. Bu hizmet, oyuncuların mevcut bir kaydedilmiş oyunu güncellemek veya geri yüklemek ya da yeni bir oyun oluşturmak için kullanıcı arayüzünü tetiklemesini de sağlayabilir.
Başlamadan önce
Henüz yapmadıysanız Kayıtlı Oyunlar oyun kavramlarını incelemeniz faydalı olabilir.
Saved Games API'yi kullanarak kodlamaya başlamadan önce:
- C++ Play Games SDK'sını yükleyin.
- C++ geliştirme ortamınızı oluşturun.
- C++ kod örneğini indirip inceleyin.
- Google Play Console'da Kayıtlı Oyunlar hizmetini etkinleştirin.
Veri biçimleri ve platformlar arası uyumluluk
Google'ın sunucularına kaydettiğiniz kayıtlı oyunlar verileri
std::vector<uint8_t>
biçiminde olmalıdır. Saved Games hizmeti, platformlar arası uyumluluk için verilerinizin kodlamasını üstlenir. Android uygulamaları, aynı verileri platformlar arası uyumluluk sorunları olmadan bayt dizisi olarak okuyabilir.
Kaydedilmiş Oyunlar verileriniz için veri biçimi seçerken platforma özgü biçimler kullanmaktan kaçının. Birden fazla platformda güçlü kitaplık desteğine sahip bir XML veya JSON gibi bir veri biçimi kullanmanızı önemle tavsiye ederiz.
Kaydedilmiş Oyunlar hizmetini etkinleştirme
Kaydedilmiş Oyunlar hizmetini kullanabilmeniz için öncelikle hizmete erişimi etkinleştirmeniz gerekir. Bunun için, gpg::GameServices::Builder
ile hizmet oluştururken EnableSnapshots()
numaralı telefonu arayın. Bu sayede, bir sonraki kimlik doğrulama etkinliğinde Kaydedilmiş Oyunlar için gerekli olan ek kimlik doğrulama kapsamları etkinleştirilir.
Kayıtlı Oyunları Görüntüleme
Oyununuzda, oyuncuların kaydedilmiş oyunları kaydetmek veya geri yüklemek için tetikleyebileceği bir seçenek sağlayabilirsiniz. Oyuncular bu seçeneği belirlediğinde oyununuz, mevcut kayıtlı slotların gösterildiği bir ekran göstermeli, oyuncuların bu slotlardan birine kaydetmesine ya da bu kartlardan birini yüklemesine izin vermeli veya yeni bir kayıtlı oyun oluşturmalıdır. Bunun için aşağıdaki yöntemi kullanın:
SnapshotManager::ShowSelectUIOperation(...)
Kaydedilmiş Oyunlar seçim kullanıcı arayüzü, oyuncuların yeni bir kayıtlı oyun oluşturmasına, mevcut kayıtlı oyunlarla ilgili ayrıntıları görüntülemesine ve önceki kayıtlı oyunları yüklemesine olanak tanır.
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);
}
Aşağıdaki örnekte varsayılan Kayıtlı Oyunlar Kullanıcı Arayüzünün nasıl getirileceği ve oyuncunun kullanıcı arayüzü seçimini nasıl yöneteceğiniz gösterilmektedir:
service_->Snapshots().ShowSelectUIOperation(
ALLOW_CREATE_SNAPSHOT,
ALLOW_DELETE_SNAPSHOT,
MAX_SNAPSHOTS,
SNAPSHOT_UI_TITLE,
[this](gpg::SnapshotManager::SnapshotSelectUIResponse const & response) {
…
}
Yukarıdaki örnekte ALLOW_CREATE_SNAPSHOT
değeri true
ve MAX_SNAPSHOTS
kullanıcının oluşturduğu anlık görüntü sayısından büyükse varsayılan Anlık Görüntü Kullanıcı Arayüzü, mevcut bir oyun seçmek yerine oyunculara yeni bir kayıt oyunu oluşturma düğmesi sunar. (Gösterildiğinde düğme kullanıcı arayüzünün alt kısmındadır.) Bir oyuncu bu düğmeyi tıkladığında SnapshotSelectUIResponse
yanıtı geçerli olur ancak veri içermez.
Kaydedilen oyunları açma ve okuma
Kayıtlı bir oyuna erişmek ve içeriğini okumak veya değiştirmek için önce kayıtlı oyunu temsil eden SnapshotMetadata
nesnesini açın. Ardından, SnapshotManager::Read*()
yöntemini çağırın.
Aşağıdaki örnekte kaydedilmiş bir oyunun nasıl açılacağı gösterilmektedir:
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);
…
}
Veri uyuşmazlıklarını tespit etme ve çözme
Bir SnapshotMetadata
nesnesini açtığınızda Kayıtlı Oyunlar hizmeti, çakışan bir kaydedilmiş oyun olup olmadığını algılar. Bir oyuncunun yerel cihazında depolanan kayıtlı oyun, Google sunucularında depolanan uzak sürümle senkronize olmadığında veri çakışmaları meydana gelebilir.
Kayıtlı bir oyunu açarken belirttiğiniz çakışma politikası, Kaydedilmiş Oyunlar hizmetine bir veri çakışmasını otomatik olarak nasıl çözebileceğini bildirir. Politika, aşağıdakilerden biri olabilir:
Anlaşmazlık Politikası | Açıklama |
---|---|
SnapshotConflictPolicy::MANUAL |
Saved Games hizmetinin herhangi bir çözüm işlemi gerçekleştirmemesi gerektiğini belirtir. Bunun yerine, oyununuz bir özel birleştirme gerçekleştirir. |
SnapshotConflictPolicy::LONGEST_PLAYTIME |
Saved Games hizmetinin en yüksek oynatma süresi değerine sahip kayıtlı oyunu seçmesi gerektiğini belirtir. |
SnapshotConflictPolicy::BASE_WINS |
Saved Games hizmetinin temel kaydedilmiş oyunu seçmesi gerektiğini belirtir. |
SnapshotConflictPolicy::REMOTE_WINS |
Saved Games hizmetinin, uzaktan kaydedilen oyunu seçmesi gerektiğini belirtir. Uzak sürüm, kayıtlı oyunun oyuncu cihazlarından birinde algılanıp ana sürümden daha yeni bir zaman damgasına sahiptir. |
GPGSnapshotConflictPolicyManual
dışında bir ihtilaf politikası belirttiyseniz Kayıtlı Oyunlar hizmeti, kayıtlı oyunu birleştirir ve SnapshotManager::OpenResponse
sürümünü kullanarak güncellenmiş sürümü döndürür. Oyununuz kaydedilen oyunu açabilir, üzerine yazabilir, ardından kayıtlı oyunu Google'ın sunucularına kaydetmek için SnapshotManager::Commit(...) yöntemini çağırabilir.
Özel birleştirme işlemi gerçekleştirme
Çakışma politikası olarak SnapshotConflictPolicy::MANUAL
değerini belirlediyseniz oyununuzun kayıtlı oyunda daha fazla okuma veya yazma işlemi gerçekleştirmeden önce tespit edilen tüm veri çakışmalarını çözmesi gerekir.
Bu durumda, bir veri çakışması algılandığında hizmet SnapshotManager::OpenResponse
üzerinden şu parametreleri döndürür:
- Bu çatışmayı benzersiz bir şekilde tanımlamak için
conflict_id
(kayıtlı oyunun son sürümünü uygularken bu değeri kullanırsınız); - Kaydedilen oyunun çakışan temel sürümü ve
- Kaydedilen oyunun çakışan uzak sürümü.
Oyununuz hangi verilerin kaydedileceğine karar vermeli, ardından Google sunucularının son sürümünü kaydetme/çözme için SnapshotManager::ResolveConflictBlocking()
yöntemini çağırmalıdır.
//Resolve conflict
gpg::SnapshotManager::OpenResponse resolveResponse =
manager.ResolveConflictBlocking(openResponse.conflict_base, metadata_change,
openResponse.conflict_id);
Kaydedilmiş oyunlar yazma
Kaydedilmiş bir oyun yazmak için önce söz konusu oyunu temsil eden SnapshotMetadata
nesnesini açın, tespit edilen tüm veri uyuşmazlıklarını giderin, ardından kayıtlı oyun değişikliklerinizi uygulamak için SnapshotManager::Commit()
yöntemini çağırın.
Aşağıdaki örnekte, bir değişikliği nasıl oluşturup kaydedilmiş bir oyunu nasıl uygulayabileceğiniz gösterilmektedir.
Önce, düzenlemek istediğimiz anlık görüntüyü açın ve tabanı seçerek tüm çakışmaların çözüldüğünden emin olun.
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 } });
Ardından, kapak resmi için kullanılan resim verilerini içeren kayıtlı bir oyun değişikliği oluşturun:
gpg::SnapshotMetadataChange::Builder builder; gpg::SnapshotMetadataChange metadata_change = builder.SetDescription("CollectAllTheStar savedata") .SetCoverImageFromPngData(pngData).Create();
Son olarak, kaydedilen oyun değişikliklerini gerçekleştirin.
gpg::SnapshotManager::CommitResponse commitResponse = service_->Snapshots().CommitBlocking(metadata, metadata_change, SetupSnapshotData());
Veri parametresi, depoladığınız tüm kayıtlı oyun verilerini içerir. Bu değişiklik, kayıtlı oyun oynama süresi ve kayıtlı oyun açıklaması gibi ek kayıtlı oyun meta verilerini de içerir.
Kayıt işlemi başarıyla tamamlanırsa oyuncular, kaydedilen oyunu Kayıtlı Oyunlar seçim kullanıcı arayüzünde görebilirler.