Thêm trò chơi đã lưu vào trò chơi của bạn

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:

Đị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_SNAPSHOTtrueMAX_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.

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