Kaydedilmiş Oyunları Oyununuza Ekleme

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:

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.

  1. Ö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
            }
          });
    
  2. 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();
    
  3. 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.