بدء استخدام "خدمات ألعاب Play" للغة C وC++

يوضّح هذا الدليل كيفية إعداد مشروع لعبة أصلي بلغة C أو C++ لاستخدام حزمة تطوير البرامج (SDK) الأصلية لإصدار 2 من "خدمات ألعاب Play" ودمج خدمة تسجيل الدخول. يجب دمج ميزة تسجيل الدخول من أجل دمج ميزات "خدمات ألعاب Play" الأخرى في لعبتك ودمج "خدمات ألعاب Play" في خادم الألعاب في الخلفية.

الميزات المتاحة

إنّ حزمة تطوير البرامج (SDK) الأصلية من الإصدار 2 من "خدمات ألعاب Play" متوفّرة في إصدار تجريبي ولا تتيح سوى خدمة "تسجيل الدخول". ولا تتوفّر بعد ميزات أخرى من "خدمات ألعاب Play".

مستندات مرجع واجهة برمجة التطبيقات

تحتوي ملفات الرأس لحزمة تطوير البرامج (SDK) على مستندات مرجعية لواجهات برمجة التطبيقات. يمكن العثور على ملفات الرأس في مجلد include ضمن ملفات حزمة SDK، والتي تصبح متاحة بعد مزامنة مشروعك مع مستودع حزمة SDK.

المتطلبات

  • مشروع لعبة يستخدم لغة C أو C++ الأصلية كلغة البرمجة الأساسية

  • يجب إعداد نظام الإنشاء Gradle في مشروع لعبتك وبيئة التطوير.

قبل البدء

عليك إعداد "خدمات ألعاب Play" في Google Play Console.

إعداد مشروع لعبتك

أكمِل الخطوات التالية لإعداد مشروع لعبتك.

تعديل ملف CMakeLists.txt

في ملف CMakeLists.txt، أضِف الرمز التالي:

  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)

تعديل build.gradle

في ملف build.gradle على مستوى التطبيق، اتّبِع الخطوات التالية:

  • تأكَّد من تفعيل ميزة إنشاء التصاميم الجاهزة.

  • أضِف التبعية لحزمة تطوير البرامج (SDK) الأصلية من الإصدار 2 من "خدمات ألعاب Play":

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

وفي ما يلي مثال لذلك:

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

تعديل ملف AndroidManifest.xml

  1. في ملف AndroidManifest.xml، حدِّد رقم تعريف مشروعك على "خدمات ألعاب Play". يمكنك إجراء ذلك من خلال إضافة الأسطر التالية إلى الملف:

    <manifest>
      <application>
        <meta-data android:name="com.google.android.gms.games.APP_ID"
                   android:value="@string/game_services_project_id"/>
      </application>
    </manifest>
    
  2. أنشئ مورد سلسلة لمعرّف مشروعك. ويسمح هذا للعبة بالوصول إلى المعرّف في وقت الإنشاء. لإنشاء المورد، أنشئ الملف project_root/app/src/main/res/values/games-ids.xml، وأضِف ما يلي:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <string name="game_services_project_id"
                translatable="false">add your Project ID here</string>
    </resources>
    
  3. أنشئ لعبتك واختبر أداءها. في حال نجاح عملية تسجيل الدخول، ستعرض لعبتك عند تشغيلها طلبًا لتسجيل الدخول أو بانر يشير إلى نجاح عملية تسجيل الدخول.

الحصول على رقم تعريف اللاعب

يمكن لتطبيقك الوصول إلى معلومات اللاعب الذي سجّل الدخول من خلال استرداد رقم تعريفه. يمكنك استرداد رقم تعريف لاعب من خلال استدعاء الدالة GetPlayerID ، كما هو موضّح في المثال التالي.

.
#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);
}

إعادة عرض طلب تسجيل الدخول

إذا رفض اللاعب طلب تسجيل الدخول الأولي إلى "خدمات ألعاب Play" الذي يظهر تلقائيًا عند تشغيل لعبتك، قد يغيّر رأيه أثناء جلسة اللعب. يمكنك إعادة عرض طلب تسجيل الدخول من خلال الاتصال بالرقم PgsGamesSignInClient_signIn ما دام لم يسجّل أي لاعب الدخول حاليًا.

تفويض خادم اللعبة

بعد أن يسجّل اللاعب الدخول إلى "خدمات ألعاب Play" بنجاح، يمكن لبرنامج تشغيل اللعبة طلب رمز تفويض الخادم الذي يمكن لخادم اللعبة في الخلفية استخدامه للتواصل بأمان مع "خدمات ألعاب Play". يسمح هذا لخادم لعبتك باسترداد بيانات المشغّل الذي سجّل الدخول وتحديثها وتخزينها. يمكنك استرداد رمز التفويض الخاص بالخادم من خلال استدعاء الدالة PgsGamesSignInClient_requestServerSideAccess.

لمزيد من المعلومات، يمكنك الاطّلاع على دليل الوصول إلى الخادم.