このガイドでは、以下を使用してプレーヤーのゲームの進行状況データを保存、読み込みする方法について説明します。 C++ アプリの保存済みゲームサービス。こちらの サービスにより、いつでもプレーヤーのゲームの進行状況を自動的に読み込んで保存できます。 使用できます。このサービスにより プレーヤーは インターフェースを使用して、既存のセーブゲームの更新や復元、新しいセーブゲームの作成を行えます。
始める前に
まだ読んでいない場合は、 保存済みゲームのコンセプト。
Saved Games API を使用してコーディングを始める前に:
- C++ Play Games SDK をインストールします。
- C++ 開発環境をセットアップします。
- C++ コードサンプルをダウンロードして確認します。
- Google Play Console で保存済みゲームサービスを有効にします。
データ形式とクロス プラットフォームの互換性
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_SNAPSHOT
が true
かつ 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 する方法を示しています。 [保存済みゲーム] を選択します。
まず、編集するスナップショットを開き、すべての競合が ベースを選択することで解決できます。
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 } });
次に、保存されたゲームの変更を作成し、 カバー画像:
gpg::SnapshotMetadataChange::Builder builder; gpg::SnapshotMetadataChange metadata_change = builder.SetDescription("CollectAllTheStar savedata") .SetCoverImageFromPngData(pngData).Create();
最後に、保存したゲームの変更をコミットします。
gpg::SnapshotManager::CommitResponse commitResponse = service_->Snapshots().CommitBlocking(metadata, metadata_change, SetupSnapshotData());
data パラメータには、保存するすべてのセーブゲーム データが含まれます。 変更には、その他の保存済みゲーム メタデータも含まれます。 説明が表示されます。
commit オペレーションが正常に完了すると、プレーヤーは 保存済みゲーム選択 UI で保存済みゲームを選択します。