بدء استخدام "خدمات ألعاب 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 على مستوى التطبيق، اتّبِع الخطوات التالية:

  • تأكَّد من تفعيل ميزة الإصدار prefab.

  • أضِف الاعتمادية إلى حزمة تطوير البرامج (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.

لمزيد من المعلومات، راجِع دليل الوصول إلى الخادم.