Bu kılavuzda, C++ uygulamasında Kayıtlı Oyunlar hizmetini kullanarak bir oyuncunun oyundaki ilerleme verilerini nasıl kaydedeceğiniz ve yükleyeceğiniz gösterilmektedir. Oynatma sırasında oyuncunun oyundaki ilerleme durumunu otomatik olarak yüklemek ve kaydetmek için bu hizmeti kullanabilirsiniz. Bu hizmet, oyuncuların mevcut bir kayıtlı oyunu güncellemek veya geri yüklemek ya da yeni bir oyun kaydetmek için kullanıcı arayüzünü tetiklemelerine de olanak tanıyabilir.
Başlamadan önce
Henüz yapmadıysanız Kayıtlı Oyunlar oyun kavramlarını incelemenizi öneririz.
Kayıtlı Oyunlar API'sini kullanarak kodlamaya başlamadan önce:
- C++ Play Games SDK'sını yükleyin.
- C++ geliştirme ortamınızı ayarlayın.
- 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. Kayıtlı Oyunlar hizmeti, verilerinizi platformlar arası uyumluluk için kodlar. Android uygulamaları, bu verileri platformlar arası uyumluluk sorunları olmadan bayt dizisi olarak okuyabilir.
Kayıtlı Oyunlar verileriniz için veri biçimi seçerken platforma özgü biçimler kullanmaktan kaçının. XML veya JSON gibi birden fazla platformda güçlü kitaplık desteğine sahip bir veri biçimi kullanmanızı önemle tavsiye ederiz.
Kaydedilmiş Oyunlar hizmetini etkinleştirme
Kayıtlı Oyunlar hizmetini kullanabilmek için önce bu hizmete erişimi etkinleştirmeniz gerekir. Bunu yapmak için gpg::GameServices::Builder
ile hizmeti oluştururken EnableSnapshots()
numaralı telefonu arayın. Bu işlem, bir sonraki kimlik doğrulama etkinliğinde Kayıtlı Oyunlar tarafından gereken ek kimlik doğrulama kapsamlarını etkinleştirir.
Kayıtlı Oyunları Göster
Oyununuzda, oyuncuların kayıtlı oyunları kaydetmek veya geri yüklemek için tetikleyebileceği bir seçenek sunabilirsiniz. Oyuncular bu seçeneği belirlediğinde oyununuz, mevcut kayıt alanlarını gösteren bir ekran açmalı ve oyuncuların bu alanlardan birine kayıt yapmalarına veya bu alanlardan oyun yüklemelerine ya da yeni bir kayıtlı oyun oluşturmalarına olanak tanımalıdır. Bunu yapmak için aşağıdaki yöntemi kullanın:
SnapshotManager::ShowSelectUIOperation(...)
Kayıtlı 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 açılacağı ve oynatıcının kullanıcı arayüzü seçiminin nasıl ele alınacağı 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
true
ise ve MAX_SNAPSHOTS
, kullanıcının o anda oluşturduğu gerçek anlık görüntü sayısından fazlaysa varsayılan anlık görüntü kullanıcı arayüzünde oyunculara mevcut bir oyunu seçmek yerine yeni bir oyun kaydetme düğmesi sunulur. (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çerlidir ancak veri içermez.
Kaydedilen oyunları açma ve okuma
Kayıtlı bir oyuna erişmek ve içeriğini okumak ya da değiştirmek için önce bu kayıtlı oyunu temsil eden SnapshotMetadata
nesnesini açın. Ardından SnapshotManager::Read*()
yöntemini çağırın.
Aşağıdaki örnekte, kayıtlı 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 çakışmalarını tespit etme ve çözme
Bir SnapshotMetadata
nesnesini açtığınızda Kayıtlı Oyunlar hizmeti, çakışan bir kayıtlı oyun olup olmadığını algılar. Bir oyuncunun yerel cihazında depolanan kayıtlı oyun, Google'ın sunucularında depolanan uzak sürümle senkronize olmadığında veri çakışmaları oluşabilir.
Kayıtlı bir oyunu açarken belirttiğiniz çakışma politikası, Kayıtlı Oyunlar hizmetine veri çakışmalarını otomatik olarak nasıl çözeceğini söyler. Politika aşağıdakilerden biri olabilir:
Çakışma Politikası | Açıklama |
---|---|
SnapshotConflictPolicy::MANUAL |
Kayıtlı Oyunlar hizmetinin herhangi bir çözüm işlemi gerçekleştirmemesi gerektiğini belirtir. Bunun yerine oyununuz özel bir birleştirme gerçekleştirir. |
SnapshotConflictPolicy::LONGEST_PLAYTIME |
Kaydedilmiş Oyunlar hizmetinin, en yüksek oynama süresi değerine sahip kayıtlı oyunu seçmesi gerektiğini belirtir. |
SnapshotConflictPolicy::BASE_WINS |
Kayıtlı Oyunlar hizmetinin temel kayıtlı oyunu seçmesi gerektiğini gösterir. |
SnapshotConflictPolicy::REMOTE_WINS |
Kayıtlı Oyunlar hizmetinin uzaktan kayıtlı oyunu seçmesi gerektiğini belirtir. Uzak sürüm, kayıtlı oyunun oyuncunun cihazlarından birinde algılanan ve temel sürümden daha yeni bir zaman damgasına sahip olan sürümüdür. |
GPGSnapshotConflictPolicyManual
dışında bir çakışma politikası belirttiyseniz Kayıtlı Oyunlar hizmeti, kayıtlı oyunu birleştirir ve elde edilen SnapshotManager::OpenResponse
değeri aracılığıyla güncellenmiş sürümü döndürür. Oyununuz, kayıtlı oyunu açabilir, bu oyuna yazabilir ve ardından SnapshotManager::Commit(...) yöntemini çağırarak kayıtlı oyunu Google'ın sunucularına kaydedebilir.
Özel bir birleştirme gerçekleştirme
Çakışma politikası olarak SnapshotConflictPolicy::MANUAL
değerini belirttiyseniz oyununuz, kayıtlı oyunda başka okuma veya yazma işlemleri gerçekleştirmeden önce algılanan tüm veri çakışmalarını çözmelidir.
Bu durumda, veri çakışması algılandığında hizmet SnapshotManager::OpenResponse
üzerinden aşağıdaki parametreleri döndürür:
- Bu çakışmayı benzersiz bir şekilde tanımlamak için bir
conflict_id
(Kayıtlı oyunun nihai sürümünü kaydetirken 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 vermelidir. Ardından, nihai sürümü Google sunucularına göndermek/çözmek 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
Kayıtlı bir oyunu yazmak için önce bu kayıtlı oyunu temsil eden SnapshotMetadata
nesnesini açın, algılanan tüm veri çakışmalarını çözün ve ardından kayıtlı oyun değişikliklerinizi kaydetmek için SnapshotManager::Commit()
yöntemini çağırın.
Aşağıdaki örnekte, nasıl değişiklik oluşturabileceğiniz ve kayıtlı bir oyunu nasıl kaydedebileceğiniz gösterilmektedir.
Öncelikle, düzenlemek istediğimiz anlık görüntüyü açın ve temeli seçerek tüm çakışmaları çözdüğünüzden 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 bir kayıtlı oyun değişikliği oluşturun:
gpg::SnapshotMetadataChange::Builder builder; gpg::SnapshotMetadataChange metadata_change = builder.SetDescription("CollectAllTheStar savedata") .SetCoverImageFromPngData(pngData).Create();
Son olarak, kayıtlı oyun değişikliklerini kaydedin.
gpg::SnapshotManager::CommitResponse commitResponse = service_->Snapshots().CommitBlocking(metadata, metadata_change, SetupSnapshotData());
data parametresi, depoladığınız tüm kayıtlı oyun verilerini içerir. Bu değişiklik, oynanan süre ve kaydedilen oyunun açıklaması gibi ek kaydedilen oyun meta verilerini de içerir.
Taahhüt işlemi başarıyla tamamlanırsa oyuncular, kayıtlı oyunu Kayıtlı Oyunlar seçim kullanıcı arayüzünde görebilir.