بدء استخدام "خدمات ألعاب Play" لـ C++

توفر حزمة SDK لخدمات ألعاب Google Play C++ واجهة برمجة تطبيقات C++ للاستخدام مع ألعاب Google Play وهي مخصصة للمطورين الذين لديهم تنفيذ حالي لـ C++ من لعبتهم.

في الوقت الحالي، تنفِّذ حزمة تطوير البرامج (SDK) الخدمات التالية:

  • التفويض
  • الإنجازات
  • أشكال ليدربورد
  • فعاليات
  • حفظ التقدم في الألعاب
  • ميزة "الاتصالات عن قرب" (Android فقط)
  • إحصاءات اللاعبين

المفاهيم

يمكنك استخدام حزمة تطوير البرامج (SDK) على مستوى عالٍ باتباع الخطوات التالية:

  1. إعداد ضبط النظام الأساسي لنظام التشغيل Android
  2. استخدام GameServices::Builder لضبط GameServices وإنشائه الخاص بك. يحاول الكائن GameServices تسجيل الدخول تلقائيًا ويعيد عرضه. النتيجة عن طريق معاودة الاتصال OnAuthActionFinished(). دوِّن النتيجة التي يرجعها رد الاتصال. في حال تعذُّر محاولة تسجيل الدخول تلقائيًا، يمكنك عرض زر للسماح للمستخدمين بتسجيل الدخول.
  3. بعد تلقّي نتيجة OnAuthActionFinished()، يمكنك استخدام عنصر GameServices والمدراء الفرعيين له لإجراء المكالمات على "خدمات ألعاب Play"، بما في ذلك:

    • تسجيل الدخول (بعد تعذُّر التفويض): StartAuthorizationUI()
    • فتح قفل الإنجازات: Achievements().Unlock()
    • عرض الإنجازات باستخدام واجهة المستخدم المدمجة: Achievements().ShowAllUI()
    • إرسال نتيجة عالية: Leaderboards().SubmitScore()
    • تسجيل الخروج: SignOut()
  4. عند الانتهاء من استخدام الكائن GameServices، عليك إعادة ضبطه أو إتلافه.

على مستوى أكثر تفصيلاً:

  1. تهيئة تهيئة نظام أساسي: هذا كائن يحتوي على معلومات التهيئة الخاصة بالنظام الأساسي. في نظام Android، تحتوي تهيئة النظام الأساسي على جهاز Java افتراضي ومؤشر إلى Activity الحالي:

    // 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. إنشاء كائن GameServices: هذا هو نقطة الدخول الرئيسية وظيفة "خدمات ألعاب Google Play". تم إنشاء GameServices مثيل مع GameServices::Builder.

    في معظم عمليات التنفيذ، سيظلّ عنصر GameServices محدّدًا ما دامت ما تقوم به بيئة C؛ فلا تحتاج إلى إعادة تهيئتها عند يتم إيقاف Android Activity مؤقتًا واستئنافه.

    // 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. استخدِم صفوف "الحساب الإداري" لإدارة عنصر GameServices. يتم الوصول إلى المدراء من مثيل GameServices والوظائف المتعلقة بالمجموعة. أمثلة على ذلك تشمل مديري الإنجازات و"لوحة الصدارة". لا تحتوي على بيانات مرئية للمستخدم عن أنفسهم. يتم إرجاع المدراء بالإشارة، وتحتوي يتحكّم مثيل واحد (GameServices) في مراحل نشاطه. لا ينبغي أبدًا أن يجري العميل في مرجع المدير. بدلاً من ذلك، يجب على العميل التمسك مثال واحد (GameServices)

    يعرض المدراء البيانات من خلال كائنات من نوع القيمة غير القابلة للتغيير. هذه القيم تعكس عرضًا متسقًا للبيانات الأساسية في النقطة الزمنية التي تم إجراء الاستعلام.

    // Submit a high score
    game_services_->Leaderboards().SubmitScore(leaderboard_id, score);
    
    // Show the default Achievements UI
    game_services_->Achievements().ShowAllUI();
    
  4. عند الانتهاء من استخدام عنصر GameServices، عليك إخلاء مساحة الاتصال بـ reset() على الرقم unique_ptr الذي يملكه، أو عن طريق السماح يؤدي unique_ptr إلى تدميرها تلقائيًا عند الخروج من النطاق.

نموذج Threading

ما لم يُذكر خلاف ذلك، تتضمّن كل طرق GameServices والحساب الإداري عمليات تنفيذ غير متزامنة وآمنة بما يتوافق مع سلسلة المحادثات يمكن استدعاؤها في أي سلسلة محادثات بدون القفل الخارجي وتنفيذه بترتيب يتوافق مع استدعائه طلبك.

تأتي طرق الموجهات (التي تكون حالة القراءة) في صيغتين رئيسيتين. الأول يوفر نوع الطريقة (بأسماء مثل FetchProperty()) نتائجها بشكل غير متزامن إلى معاودة اتصال مقدَّمة الثاني (بأسماء مثل FetchPropertyBlocking()) يعرض نتائجه بشكل متزامن إلى المكالمات .

// 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);});

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

معلومات خاصة بالمنصة

لبدء استخدام حزمة تطوير البرامج (SDK) الخاصة بألعاب Play C++ على نظام التشغيل Android، انتقِل إلى دليل البدء السريع

محتوى إضافي للقراءة

احرص على قراءة مستندات الصف الواردة في لعبة Google Play. خدمات C++ SDK لمزيد من التفاصيل، ومراجعة النماذج التي توضّح كيفية استخدام حزمة SDK.

إذا كانت لعبتك تستخدم خادم خلفية، يُرجى الاطّلاع على تفعيل الوصول من جهة الخادم إلى "خدمات ألعاب Google Play"