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 API C++ để sử dụng với Google Play Games dịch vụ và dành cho những nhà phát triển đã triển khai C++ trò chơi của họ.

Hiện tại, SDK này 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ẽ 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 GameServices . Đối tượng GameServices tự động tìm cách đăng nhập rồi trả về kết quả thông qua lệnh gọi lại OnAuthActionFinished(). Ghi lại kết quả được lệnh gọi lại trả về. Nếu quá trình đăng nhập tự động không thành cô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à Trình quản lý con của đối tượng đó để thực hiện lệnh gọi cho Dịch vụ trò chơi của Play, 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 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ỷ đối tượng đó.

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

  1. Khởi tạo cấu hình nền tảng: Đây là một đố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 phần tử Máy ảo Java và một 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 của Dịch vụ trò chơi của Google Play. Đã tạo GameServices thực thể cùng với GameServices::Builder.

    Trong hầu hết các lần triển khai, một đối tượng GameServices nhất định sẽ vẫn tồn tại miễn là môi trường C của bạn thực hiện; bạn không cần khởi chạy lại khi Activity Android 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 Người quản lý để quản lý đối tượng GameServices. Người quản lý được truy cập từ một thực thể GameServices và chức năng liên quan đến nhóm khi kết hợp cùng nhau. Ví dụ: chẳng hạn như Người quản lý thành tích và Người quản lý bảng xếp hạng. Chúng không hiển thị cho người dùng tự khẳng định bản thân. Trình quản lý được trả về bằng tham chiếu và hàm chứa Thực thể GameServices kiểm soát vòng đời của chúng. Khách hàng của bạn không bao giờ nên giữ vào một tham chiếu Người quản lý. Thay vào đó, khách hàng của bạn nên tiếp tục Thực thể GameServices.

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

    // 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 miền đó hoặc bằng cách cho phép unique_ptr sẽ tự động huỷ bỏ khi ra khỏi phạm vi.

Mô hình luồng

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

Phương thức truy cập (các phương thức đọc trạng thái) có 2 biến thể chính. Đầu tiên loại phương thức (có tên như FetchProperty()) cung cấp kết quả không đồng bộ cho một cuộc gọi lại được cung cấp; phương diện thứ hai (với các tên như FetchPropertyBlocking()) trả về kết quả một cách đồng bộ cho lệnh gọi chuỗ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. Chuỗi cuộc trò chuyện này có thể khác với bất kỳ khái niệm nền tảng nào của một "luồng chính" hoặc "Giao diện người dùng chuỗi". Bạn cũng nên cố gắng đảm bảo rằng các lệnh gọi lại của người dùng thực thi nhanh chóng; một chuỗi gọi lại bị gián đoạn có thể gây ra các vấn đề mà người dùng nhìn thấy (ví dụ: việc hoàn thành quá trình đăng xuất bị chậm trễ yêu cầu).

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

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

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

Hãy nhớ đọc tài liệu về lớp học có trong Google Play Game dịch vụ C++ SDK để biết thêm chi tiết và hãy xem 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 Bật quyền truy cập phía máy chủ vào Dịch vụ trò chơi của Google Play.