Hướng dẫn này chỉ cho bạn cách lưu và tải dữ liệu tiến trình trò chơi của người chơi bằng cách sử dụng dịch vụ Trò chơi đã lưu trong ứng dụng C++. Bạn có thể dùng để tự động tải và lưu tiến trình chơi của người chơi bất cứ lúc nào trong khi chơi. Dịch vụ này cũng cho phép người chơi kích hoạt một người dùng để cập nhật hoặc khôi phục một trò chơi đã lưu hiện có hoặc tạo một trò chơi mới.
Trước khi bắt đầu
Nếu chưa từng làm như vậy, bạn có thể xem lại Khái niệm trò chơi trong Trò chơi đã lưu.
Trước khi bắt đầu lập trình bằng API Trò chơi đã lưu:
- Cài đặt C++ Play Games SDK.
- Thiết lập môi trường phát triển C++.
- Tải xuống và xem lại mã mẫu C++.
- Bật dịch vụ Trò chơi đã lưu trong Google Play Console.
Định dạng dữ liệu và khả năng tương thích trên nhiều nền tảng
Dữ liệu Trò chơi đã lưu mà bạn lưu vào máy chủ của Google phải nằm trong
Định dạng std::vector<uint8_t>
. Dịch vụ Trò chơi đã lưu sẽ xử lý việc mã hoá
dữ liệu của bạn để đảm bảo khả năng tương thích trên nhiều nền tảng; Các ứng dụng Android có thể đọc bằng
cùng dữ liệu này dưới dạng một mảng byte mà không gặp bất kỳ vấn đề nào về khả năng tương thích trên nhiều nền tảng.
Tránh sử dụng định dạng dành riêng cho nền tảng khi chọn định dạng dữ liệu cho Dữ liệu Trò chơi đã lưu. Chúng tôi thực sự khuyên bạn nên sử dụng định dạng dữ liệu, như XML hoặc JSON có hỗ trợ thư viện mạnh mẽ trên nhiều nền tảng.
Bật dịch vụ Trò chơi đã lưu
Để có thể sử dụng dịch vụ Trò chơi đã lưu, trước tiên bạn phải cho phép truy cập vào
nó. Để thực hiện việc này, hãy gọi EnableSnapshots()
khi bạn tạo dịch vụ bằng
gpg::GameServices::Builder
Thao tác này sẽ bật phạm vi xác thực bổ sung
mà Trò chơi đã lưu yêu cầu tại sự kiện xác thực tiếp theo.
Đang hiển thị trò chơi đã lưu
Trong trò chơi của mình, bạn có thể cung cấp một tuỳ chọn mà người chơi có thể kích hoạt để lưu hoặc khôi phục trò chơi đã lưu. Khi người chơi chọn phương án này, trò chơi của bạn sẽ một màn hình hiển thị các ô lưu hiện có và cho phép người chơi lưu hoặc tải từ một trong các vị trí này hoặc tạo một trò chơi đã lưu mới. Sử dụng phương thức sau:
SnapshotManager::ShowSelectUIOperation(...)
Giao diện người dùng chọn Trò chơi đã lưu cho phép người chơi để tạo trò chơi đã lưu mới, xem thông tin chi tiết về trò chơi đã lưu hiện có, và tải trò chơi đã lưu trước đó.
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);
}
Ví dụ sau minh hoạ cách hiển thị giao diện người dùng mặc định cho Trò chơi đã lưu và xử lý lựa chọn giao diện người dùng của trình phát:
service_->Snapshots().ShowSelectUIOperation(
ALLOW_CREATE_SNAPSHOT,
ALLOW_DELETE_SNAPSHOT,
MAX_SNAPSHOTS,
SNAPSHOT_UI_TITLE,
[this](gpg::SnapshotManager::SnapshotSelectUIResponse const & response) {
…
}
Nếu trong ví dụ trên, ALLOW_CREATE_SNAPSHOT
là true
và MAX_SNAPSHOTS
lớn hơn số lượng ảnh chụp nhanh thực tế mà người dùng hiện có
tạo, giao diện người dùng Ảnh chụp nhanh mặc định sẽ cung cấp cho người chơi nút để tạo
lưu trò chơi thay vì chọn một trò chơi hiện có. (Khi được hiển thị, nút
nằm ở cuối giao diện người dùng.) Khi người chơi nhấp vào nút này,
Phản hồi của SnapshotSelectUIResponse
hợp lệ nhưng không có dữ liệu.
Mở và đọc trò chơi đã lưu
Để truy cập vào trò chơi đã lưu và đọc hoặc sửa đổi nội dung của trò chơi đó, trước tiên, hãy mở trò chơi đó
đối tượng SnapshotMetadata
đại diện cho trò chơi đã lưu đó. Tiếp theo, hãy gọi
SnapshotManager::Read*()
.
Ví dụ sau đây trình bày cách mở một trò chơi đã lưu:
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);
…
}
Phát hiện và giải quyết xung đột dữ liệu
Khi bạn mở một đối tượng SnapshotMetadata
, dịch vụ Trò chơi đã lưu sẽ phát hiện
liệu có xung đột trò chơi đã lưu hay không. Xung đột dữ liệu có thể xảy ra khi
trò chơi lưu trữ trên thiết bị cục bộ của người chơi không đồng bộ với phiên bản từ xa
được lưu trữ trong các máy chủ của Google.
Chính sách xung đột mà bạn chỉ định khi mở một trò chơi đã lưu sẽ cho Cách tự động giải quyết xung đột dữ liệu trong dịch vụ trò chơi. Chính sách đó có thể là một trong những chính sách sau:
Chính sách xung đột | Mô tả |
---|---|
SnapshotConflictPolicy::MANUAL |
Cho biết rằng dịch vụ Trò chơi đã lưu sẽ không hoạt động để thực hiện hành động giải quyết. Thay vào đó, trò chơi của bạn sẽ thực hiện một hợp nhất tuỳ chỉnh. |
SnapshotConflictPolicy::LONGEST_PLAYTIME |
Cho biết dịch vụ Trò chơi đã lưu sẽ chọn trò chơi đã lưu có giá trị thời gian chơi lớn nhất. |
SnapshotConflictPolicy::BASE_WINS |
Cho biết dịch vụ Trò chơi đã lưu sẽ chọn cơ sở trò chơi đã lưu. |
SnapshotConflictPolicy::REMOTE_WINS |
Cho biết dịch vụ Trò chơi đã lưu sẽ chọn điều khiển từ xa trò chơi đã lưu. Phiên bản từ xa là phiên bản của được phát hiện trên một trong các thiết bị của người chơi và có so với phiên bản cơ sở. |
Nếu bạn đã chỉ định một chính sách xung đột khác ngoài GPGSnapshotConflictPolicyManual
,
dịch vụ Trò chơi đã lưu sẽ hợp nhất trò chơi đã lưu và trả về phiên bản cập nhật
thông qua giá trị SnapshotManager::OpenResponse
thu được. Trò chơi của bạn có thể mở
trò chơi đã lưu, hãy ghi vào trò chơi đó, sau đó gọi SnapshotManager::Commit(...)
để cam kết trò chơi đã lưu vào máy chủ của Google.
Hợp nhất tuỳ chỉnh
Nếu bạn đã chỉ định SnapshotConflictPolicy::MANUAL
làm chính sách xung đột,
trò chơi của bạn phải giải quyết mọi xung đột dữ liệu được phát hiện trước khi thực hiện các chiến dịch khác
thao tác đọc hoặc ghi trên trò chơi đã lưu.
Trong trường hợp này, khi phát hiện xung đột dữ liệu, dịch vụ sẽ trả về
các tham số sau thông qua SnapshotManager::OpenResponse
:
conflict_id
để xác định riêng biệt cuộc xung đột này (bạn sẽ sử dụng giá trị này khi chuyển giao phiên bản cuối cùng của trò chơi đã lưu);- Phiên bản cơ sở có xung đột của trò chơi đã lưu; và
- Phiên bản từ xa có xung đột của trò chơi đã lưu.
Trò chơi của bạn phải quyết định dữ liệu nào cần lưu, sau đó gọi hàm
Phương thức SnapshotManager::ResolveConflictBlocking()
để cam kết/giải quyết kết quả cuối cùng
phiên bản đến máy chủ của Google.
//Resolve conflict
gpg::SnapshotManager::OpenResponse resolveResponse =
manager.ResolveConflictBlocking(openResponse.conflict_base, metadata_change,
openResponse.conflict_id);
Đang ghi trò chơi đã lưu
Để viết một trò chơi đã lưu, trước tiên, hãy mở đối tượng SnapshotMetadata
biểu thị
trò chơi đã lưu, giải quyết mọi xung đột dữ liệu được phát hiện, sau đó gọi
Phương thức SnapshotManager::Commit()
để xác nhận dữ liệu bạn đã lưu
trò chơi của họ.
Ví dụ sau cho thấy cách bạn có thể tạo một thay đổi và cam kết trò chơi đã lưu.
Trước tiên, mở bản tổng quan nhanh mà chúng ta muốn chỉnh sửa và đảm bảo tất cả các xung đột đều được giải quyết bằng cách chọn cơ số.
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 } });
Tiếp theo, hãy tạo một thay đổi đã lưu cho trò chơi bao gồm dữ liệu hình ảnh được dùng cho ảnh bìa:
gpg::SnapshotMetadataChange::Builder builder; gpg::SnapshotMetadataChange metadata_change = builder.SetDescription("CollectAllTheStar savedata") .SetCoverImageFromPngData(pngData).Create();
Cuối cùng, hãy áp dụng các thay đổi đối với trò chơi đã lưu.
gpg::SnapshotManager::CommitResponse commitResponse = service_->Snapshots().CommitBlocking(metadata, metadata_change, SetupSnapshotData());
Tham số dữ liệu chứa tất cả dữ liệu trò chơi đã lưu mà bạn đang lưu trữ. Thay đổi này cũng chứa siêu dữ liệu bổ sung đã lưu về trò chơi, chẳng hạn như thời gian đã chơi và nội dung mô tả cho trò chơi đã lưu.
Nếu thao tác cam kết hoàn tất thành công, người chơi có thể thấy trò chơi đã lưu trong giao diện người dùng chọn Trò chơi đã lưu.