保存済みゲームをゲームに追加する

このガイドでは、以下を使用してプレーヤーのゲームの進行状況データを保存、読み込みする方法について説明します。 C++ アプリの保存済みゲームサービス。こちらの サービスにより、いつでもプレーヤーのゲームの進行状況を自動的に読み込んで保存できます。 使用できます。このサービスにより プレーヤーは インターフェースを使用して、既存のセーブゲームの更新や復元、新しいセーブゲームの作成を行えます。

始める前に

まだ読んでいない場合は、 保存済みゲームのコンセプト

Saved Games API を使用してコーディングを始める前に:

データ形式とクロス プラットフォームの互換性

Google のサーバーに保存する保存済みゲームのデータは、 std::vector<uint8_t> 形式。保存済みゲームサービスによってエンコーディングが クロスプラットフォーム対応でのデータ活用Android アプリは クロス プラットフォームの互換性の問題なしに、同じデータをバイト配列として格納できます。

使用するデータ形式を選択する際は、プラットフォーム固有の形式を使用しない 保存済みゲームのデータ。次のようなデータ形式を使用することを強くおすすめします。 XML や JSON: 複数のプラットフォームで強力なライブラリ サポートを提供します。

保存済みゲームサービスを有効にする

保存済みゲームサービスを使用するには、まず次のアイテムへのアクセスを有効にする必要があります。 できます。これを行うには、サービスの作成時に EnableSnapshots() を呼び出します。 gpg::GameServices::Builder。これにより、追加の認証スコープが有効になります。 (次回の認証イベントで保存済みゲームから要求されます)。

保存済みゲームの表示

ゲームでは、プレーヤーが保存または開始をトリガーできるオプションを提供できます。 保存済みゲームを復元できます。プレーヤーがこのオプションを選択した場合、ゲームでは 既存のセーブスロットを表示する画面を作成し、プレーヤーが 新しい保存済みゲームを作成することもできます。こちらの 次のメソッドを使用します。

  SnapshotManager::ShowSelectUIOperation(...)

保存済みゲーム選択 UI では、 新しい保存済みゲームの作成、既存の保存済みゲームの詳細の表示、 以前の保存済みゲームを読み込みます。

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

次の例は、デフォルトの保存済みゲーム UI を表示する方法を示しています。 プレーヤーの UI の選択を処理します。

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

上記の例で、ALLOW_CREATE_SNAPSHOTtrue かつ MAX_SNAPSHOTS の場合 ユーザーが現在保持している実際のスナップショット数より大きい デフォルトのスナップショット UI には、新しいスナップショットを作成するためのボタンを 既存のゲームを選択するのではなく、保存済みのゲームを使用します。(このボタンが表示されている場合、 UI の一番下にあります)。プレーヤーがこのボタンをクリックすると、 SnapshotSelectUIResponse のレスポンスは有効ですが、データがありません。

保存済みゲームの開始と読み取り

保存済みゲームにアクセスしてコンテンツの読み取りや変更を行うには、まず その保存済みゲームを表す SnapshotMetadata オブジェクト。次に、 SnapshotManager::Read*() メソッドを使用します。

次の例は、保存済みゲームを開く方法を示しています。

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

データ競合の検出と解決

SnapshotMetadata オブジェクトを開くと、保存済みゲームサービスが 競合する保存済みゲームが存在するかどうか。データが保存されたままのときに、 プレーヤーのローカル デバイスに保存されているゲームがリモート バージョンと同期していない 保存されているデータです。

保存済みゲームを開くときに指定した競合ポリシーによって、保存済みゲームが ゲームサービスでデータの競合を自動的に解決する方法。 このポリシーは次のいずれかになります。

競合ポリシー 説明
SnapshotConflictPolicy::MANUAL 保存済みゲームサービスが 示されます。代わりに、ゲームでは カスタムマージを利用できます。
SnapshotConflictPolicy::LONGEST_PLAYTIME 保存済みゲームサービスが 最も時間のかかる保存済みゲームです。
SnapshotConflictPolicy::BASE_WINS 保存済みゲームサービスがベース [保存済みゲーム] を選択します。
SnapshotConflictPolicy::REMOTE_WINS 保存済みゲームサービスがリモコン [保存済みゲーム] を選択します。リモート バージョンは、保存されたバージョンの プレーヤーのデバイスのいずれかで検出され、より新しい タイムスタンプをベースバージョンよりも大きくします。

GPGSnapshotConflictPolicyManual 以外の競合ポリシーを指定した場合、 保存済みゲームサービスは、保存済みゲームを統合して、更新されたバージョンを返します。 結果の SnapshotManager::OpenResponse 値で処理します。ゲームを開くことができます 保存したゲームに書き込んでから、SnapshotManager::Commit(...) を呼び出します。 メソッドを使用して、保存済みゲームを Google のサーバーに commit します。

カスタム マージの実行

競合ポリシーとして SnapshotConflictPolicy::MANUAL を指定した場合、 続行する前に、検出されたデータの競合をゲームで解決する必要があります 保存されたゲームに対する読み取りまたは書き込みオペレーションです。

この場合、データの競合が検出されると、サービスは SnapshotManager::OpenResponse で次のパラメータを指定します。

  • この競合を一意に識別するための conflict_id(この値を使用します) 保存済みゲームの最終バージョンを commit するとき)
  • 保存済みゲームの競合ベース バージョンおよび
  • 保存済みゲームの競合するリモート バージョン。

ゲームで保存するデータを決定してから、 SnapshotManager::ResolveConflictBlocking() メソッドを使用して、最終版を commit/解決します。 Google のサーバーに送信します。

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

保存済みゲームの作成

保存済みゲームを書き込むには、まず、ゲームを表す SnapshotMetadata オブジェクトを開きます。 検出されたデータの競合を解決してから、 SnapshotManager::Commit() メソッドを使用して、保存したファイルを commit します。 説明します。

次の例は、変更を作成し、メッセージを commit する方法を示しています。 [保存済みゲーム] を選択します。

  1. まず、編集するスナップショットを開き、すべての競合が ベースを選択することで解決できます。

    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. 次に、保存されたゲームの変更を作成し、 カバー画像:

    gpg::SnapshotMetadataChange::Builder builder;
    gpg::SnapshotMetadataChange metadata_change =
        builder.SetDescription("CollectAllTheStar savedata")
                 .SetCoverImageFromPngData(pngData).Create();
    
  3. 最後に、保存したゲームの変更をコミットします。

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

    data パラメータには、保存するすべてのセーブゲーム データが含まれます。 変更には、その他の保存済みゲーム メタデータも含まれます。 説明が表示されます。

commit オペレーションが正常に完了すると、プレーヤーは 保存済みゲーム選択 UI で保存済みゲームを選択します。