Làm quen với Dịch vụ trò chơi của Play dành cho C++

SDK C++ của dịch vụ trò chơi của Google Play cung cấp một API C++ để sử dụng với các dịch vụ Trò chơi của Google Play, đồng thời dành cho các nhà phát triển hiện đang triển khai C++ cho trò chơi của họ.

Hiện tại, SDK triển khai các dịch vụ sau:

  • Ủy quyền
  • Thành tích
  • Bảng xếp hạng
  • Sự kiện
  • Trò chơi đã lưu
  • Kết nối lân cận (chỉ dành cho Android)
  • Số liệu thống kê về người chơi

Khái niệm

Nhìn chung, bạn sử dụng SDK bằng cách làm theo các bước sau:

  1. Thiết lập cấu hình nền tảng cho Android.
  2. Sử dụng GameServices::Builder để định cấu hình và tạo đối tượng GameServices. Đối tượng GameServices tự động tìm cách đăng nhập và trả về kết quả thông qua lệnh gọi lại OnAuthActionFinished(). Ghi lại kết quả mà lệnh gọi lại trả về. Nếu không đăng nhập được tự động, bạn có thể hiển thị một nút để cho phép người dùng đăng nhập.
  3. Sau khi nhận được kết quả OnAuthActionFinished(), bạn có thể sử dụng đối tượng GameServices và các Trình quản lý con của đối tượng đó để thực hiện lệnh gọi dịch vụ Play Games, bao gồm:

    • Đăng nhập (sau khi uỷ quyền không thành công): StartAuthorizationUI()
    • Mở khóa thành tích: Achievements().Unlock()
    • Hiển thị thành tích bằng cách sử dụng giao diện người dùng tích hợp sẵn: Achievements().ShowAllUI()
    • Gửi điểm cao: Leaderboards().SubmitScore()
    • Đăng xuất: SignOut()
  4. Khi bạn sử dụng xong đối tượng GameServices, hãy đặt lại hoặc huỷ bỏ đối tượng đó.

Ở cấp độ chi tiết hơn:

  1. Khởi chạy cấu hình nền tảng: Đây là đối tượng chứa thông tin khởi chạy dành riêng cho nền tảng. Trên Android, cấu hình nền tảng chứa máy ảo Java và con trỏ đến Activity hiện tại:

    // In android_main(), create a platform configuration
    // and bind the object activity.
    // Alternately, attach the activity in JNI_Onload().
    gpg::AndroidPlatformConfiguration platform_configuration;
    platform_configuration.SetActivity(state->activity->clazz);
    
  2. Tạo đối tượng GameServices: Đối tượng này là điểm truy cập chính cho chức năng Dịch vụ trò chơi của Google Play. Các thực thể GameServices được tạo bằng GameServices::Builder.

    Trong hầu hết các trường hợp triển khai, một đối tượng GameServices nhất định sẽ tồn tại miễn là môi trường C của bạn; bạn không cần khởi động lại khi Android Activity tạm dừng và tiếp tục.

    // Creates a GameServices object that has lambda callbacks.
    game_services_ = gpg::GameServices::Builder()
            .SetDefaultOnLog(gpg::LogLevel::VERBOSE)
            .SetOnAuthActionStarted([started_callback](gpg::AuthOperation op) {
                is_auth_in_progress_ = true;
                started_callback(op);
            })
            .SetOnAuthActionFinished([finished_callback](gpg::AuthOperation op,
                                                         gpg::AuthStatus status) {
                LOGI("Sign in finished with a result of %d", status);
                is_auth_in_progress_ = false;
                finished_callback(op, status);
            })
            .Create(pc);
    
  3. Sử dụng các lớp của Trình quản lý để quản lý đối tượng GameServices. Trình quản lý có thể được truy cập từ một phiên bản GameServices và chức năng liên quan đến nhóm cùng nhau. Ví dụ: Thành tích và Trình quản lý bảng xếp hạng. Các thành phần này không chứa trạng thái mà người dùng nhìn thấy được. Trình quản lý được trả về bằng cách tham chiếu và bản sao GameServices chứa các quyền kiểm soát vòng đời của chúng. Khách hàng của bạn không được giữ tham chiếu của Người quản lý. Thay vào đó, ứng dụng khách của bạn nên giữ lại bản sao GameServices.

    Trình quản lý trả về dữ liệu thông qua các đối tượng của loại giá trị không thể thay đổi. Các giá trị này phản ánh chế độ xem nhất quán về dữ liệu cơ bản tại thời điểm thực hiện truy vấn.

    // Submit a high score
    game_services_->Leaderboards().SubmitScore(leaderboard_id, score);
    
    // Show the default Achievements UI
    game_services_->Achievements().ShowAllUI();
    
  4. Khi bạn sử dụng xong đối tượng GameServices, hãy dọn dẹp bằng cách gọi reset() trên unique_ptr sở hữu đối tượng đó hoặc bằng cách để unique_ptr tự động huỷ đối tượng khi nằm ngoài phạm vi.

Mô hình luồng

Trừ khi có ghi chú khác, tất cả phương thức GameServices và Trình quản lý đều có cách triển khai không đồng bộ, an toàn với luồng. Chúng có thể được gọi trên bất kỳ luồng nào mà không có khoá bên ngoài và sẽ thực thi theo thứ tự nhất quán với thứ tự gọi.

Phương thức truy cập (phương thức đọc trạng thái) có hai biến thể chính. Loại phương thức đầu tiên (có tên như FetchProperty()) cung cấp không đồng bộ kết quả của lệnh gọi lại đó; phương thức thứ hai (có tên như FetchPropertyBlocking()) trả về đồng bộ kết quả cho luồng gọi.

// Blocking callback
gpg::AchievementManager::FetchAllResponse fetchResponse =
        game_services_->Achievements().FetchAllBlocking(std::chrono::milliseconds(1000));

// Non-blocking callback
game_services_->Achievements().FetchAll(gpg::DataSource::CACHE_OR_NETWORK,
    [] (gpg::AchievementManager::FetchAllResponse response) {
    LogI("Achievement response status: %d", response.status);});

Tất cả các lệnh gọi lại của người dùng đều được gọi trên một luồng gọi lại chuyên dụng. Luồng này có khả năng khác với bất kỳ khái niệm nền tảng nào của "luồng chính" hoặc "luồng giao diện người dùng". Bạn cũng nên cố gắng đảm bảo rằng các lệnh gọi lại người dùng thực thi nhanh chóng; một chuỗi lệnh gọi lại bị trì hoãn có thể gây ra các vấn đề mà người dùng có thể nhìn thấy (ví dụ: hoàn thành một yêu cầu đăng xuất bị trì hoãn).

Thông tin dành riêng cho nền tảng

Để bắt đầu sử dụng SDK Play Games C++ trên Android, hãy tiếp tục với hướng dẫn nhanh.

Tài liệu đọc thêm

Hãy nhớ đọc tài liệu về lớp có trong SDK C++ của dịch vụ trò chơi của Google Play để biết thêm thông tin chi tiết và xem các mẫu minh hoạ cách sử dụng SDK.

Nếu trò chơi của bạn sử dụng máy chủ phụ trợ, hãy xem phần Bật Quyền truy cập phía máy chủ vào Dịch vụ trò chơi của Google Play.