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

Hướng dẫn này mô tả cách thiết lập dự án trò chơi viết bằng C hoặc C++ gốc để sử dụng SDK gốc của Dịch vụ trò chơi của Play phiên bản 2 và tích hợp dịch vụ Đăng nhập. Bạn cần tích hợp dịch vụ Đăng nhập để tích hợp các tính năng khác trong Dịch vụ trò chơi của Play vào trò chơi của mình và để tích hợp Dịch vụ trò chơi của Play vào máy chủ phụ trợ của trò chơi.

Tính năng được hỗ trợ

SDK gốc trong Dịch vụ trò chơi của Play phiên bản 2 đang ở giai đoạn thử nghiệm beta và chỉ hỗ trợ dịch vụ Đăng nhập. SDK này chưa hỗ trợ các tính năng khác trong Dịch vụ trò chơi của Play.

Tài liệu tham khảo API

SDK này có các tệp tiêu đề cung cấp tài liệu tham khảo API. Tệp tiêu đề nằm trong thư mục include thuộc tệp SDK. Bạn có thể sử dụng các tệp tiêu đề đó sau khi đồng bộ hoá dự án với kho lưu trữ SDK.

Yêu cầu

  • Một dự án trò chơi sử dụng ngôn ngữ C hoặc C++ gốc làm ngôn ngữ lập trình chính.

  • Bạn phải thiết lập hệ thống xây dựng Gradle cho dự án trò chơi và môi trường phát triển của mình.

Trước khi bắt đầu

Bạn phải thiết lập Dịch vụ trò chơi của Google Play trong Google Play Console.

Thiết lập dự án trò chơi

Hãy hoàn tất các bước sau đây để thiết lập dự án trò chơi của bạn.

Cập nhật CMakeLists.txt

Trong tệp CMakeLists.txt, hãy thêm mã sau đây:

  find_package(com.google.android.gms.games.v2.c REQUIRED CONFIG)

  // link games_static for -DANDROID_STL=c++_static or default
  // link games_shared for -DANDROID_STL=c++_shared
  target_link_libraries(
    app PUBLIC com.google.android.gms.games.v2.c::games_static)

Cập nhật build.gradle

Trong tệp build.gradle ở cấp ứng dụng, hãy làm như sau:

  • Đảm bảo bạn đã bật tính năng bản dựng prefab.

  • Thêm phần phụ thuộc cho SDK gốc trong Dịch vụ trò chơi của Play phiên bản 2:

    • com.google.android.gms:play-services-games-v2-native-c:17.0.0-beta1

Sau đây là ví dụ:

  android {
    ...
    buildFeatures {
      prefab true
    }
    ...
  }
  dependencies {
    ...
    implementation "com.google.android.gms:play-services-games-v2-native-c:17.0.0-beta1"
  }

Cập nhật AndroidManifest.xml

  1. Trong tệp AndroidManifest.xml, hãy xác định mã dự án Dịch vụ trò chơi của Play. Bạn có thể thực hiện việc này bằng cách thêm các dòng sau vào tệp đó:

    <manifest>
      <application>
        <meta-data android:name="com.google.android.gms.games.APP_ID"
                   android:value="@string/game_services_project_id"/>
      </application>
    </manifest>
    
  2. Tạo tài nguyên chuỗi cho mã dự án. Bước này cho phép trò chơi của bạn sử dụng mã dự án trong thời gian xây dựng. Để tạo tài nguyên, hãy tạo tệp project_root/app/src/main/res/values/games-ids.xml rồi thêm đoạn mã sau đây:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <string name="game_services_project_id"
                translatable="false">add your Project ID here</string>
    </resources>
    
  3. Tạo và thử nghiệm trò chơi của bạn. Nếu thành công thì khi khởi chạy trò chơi, bạn sẽ thấy lời nhắc đăng nhập hoặc biểu ngữ đăng nhập thành công.

Lấy mã nhận dạng người chơi

Trò chơi của bạn có thể truy cập vào thông tin người chơi của một người chơi đã đăng nhập bằng cách truy xuất mã nhận dạng người chơi của họ. Bạn có thể truy xuất mã nhận dạng người chơi bằng cách gọi hàm GetPlayerID, như minh hoạ trong ví dụ dưới đây.

#include <assert.h>
#include "gni/gni.h"
#include "gni/gni_task.h"
#include "pgs/pgs_play_games.h"
#include "pgs/pgs_players_client.h"

// A callback for a GniTask returned from PgsPlayersClient_getCurrentPlayerId.
void OnGetCurrentPlayerIdCompleteCallback(GniTask *task, void *user_data) {

   if (!GniTask_isSuccessful(task)) {
      const char *error_message = nullptr;
      GniTask_getErrorMessage(task, &error_message);

      // Log error message here.

      GniString_destroy(error_message);
      GniTask_destroy(task);
      return;
   }

   const char *result = nullptr;
   PgsPlayersClient_getCurrentPlayerId_getResult(task, &result);

   // Log player id here.

   GniString_destroy(result);
   GniTask_destroy(task);
}

// Gets the player ID.
void GetPlayerId(jobject main_activity) {
   static const PgsPlayersClient *players_client =
           PgsPlayGames_getPlayersClient(main_activity);

   GniTask *get_current_player_id_task =
           PgsPlayersClient_getCurrentPlayerId(players_client);
   assert(get_current_player_id_task != nullptr);
   GniTask_addOnCompleteCallback(get_current_player_id_task,
                                 OnGetCurrentPlayerIdCompleteCallback,
                                 nullptr);
}

// Entry point for our test app
void TestPGSNative(JNIEnv *env, jobject main_activity) {
   JavaVM *java_vm;
   env->GetJavaVM(&java_vm);

   GniCore_init(java_vm, main_activity);

   GetPlayerId(main_activity);
}

Chạy lại lời nhắc đăng nhập

Nếu lúc đầu người chơi từ chối lời nhắc đăng nhập vào Dịch vụ trò chơi của Play (lời nhắc này tự động hiện ra khi trò chơi khởi chạy), thì người chơi đó có thể thay đổi ý định trong phiên chơi. Bạn có thể chạy lại lời nhắc đăng nhập bằng cách gọi PgsGamesSignInClient_signIn, miễn là không có người chơi nào đang đăng nhập.

Uỷ quyền máy chủ trò chơi

Sau khi người chơi đăng nhập thành công vào Dịch vụ trò chơi của Play, ứng dụng trò chơi của bạn có thể yêu cầu mã uỷ quyền máy chủ mà máy chủ phụ trợ của trò chơi có thể dùng để giao tiếp an toàn với Dịch vụ trò chơi của Play. Qua đó, máy chủ trò chơi có thể truy xuất, cập nhật và lưu trữ dữ liệu cho người chơi đã đăng nhập. Bạn có thể truy xuất mã uỷ quyền máy chủ bằng cách gọi hàm PgsGamesSignInClient_requestServerSideAccess.

Để biết thêm thông tin, hãy xem hướng dẫn truy cập máy chủ.