Play Games Services برای C++

پس از منسوخ شدن رابط برنامه‌نویسی کاربردی ورود گوگل (Google Sign-In API)، ما در سال ۲۰۲۶ کیت توسعه نرم‌افزاری بازی‌ها نسخه ۱ (games v1 SDK) را حذف خواهیم کرد. پس از فوریه ۲۰۲۵، شما قادر به انتشار عناوینی که به تازگی با کیت توسعه نرم‌افزاری بازی‌ها نسخه ۱ (games v1 SDK) ادغام شده‌اند، در گوگل پلی نخواهید بود. توصیه می‌کنیم به جای آن از کیت توسعه نرم‌افزاری بازی‌ها نسخه ۲ (games v2 SDK) استفاده کنید.
در حالی که عناوین موجود با بازی‌های قبلی نسخه ۱ ادغام‌شده تا چند سال دیگر به کار خود ادامه می‌دهند، توصیه می‌شود از ژوئن ۲۰۲۵ به نسخه ۲ مهاجرت کنید .
این راهنما برای استفاده از SDK نسخه ۱ سرویس بازی‌های Play Games است. SDK مربوط به C++ برای سرویس بازی‌های Play Games نسخه ۲ هنوز در دسترس نیست.

کیت توسعه نرم‌افزار C++ سرویس‌های بازی‌های گوگل پلی، یک رابط برنامه‌نویسی کاربردی (API) سی‌پلاس‌پلاس برای استفاده با سرویس‌های بازی گوگل پلی ارائه می‌دهد و برای توسعه‌دهندگانی در نظر گرفته شده است که یک پیاده‌سازی سی‌پلاس‌پلاس از بازی خود دارند.

در حال حاضر، SDK سرویس‌های زیر را پیاده‌سازی می‌کند:

  • مجوز
  • دستاوردها
  • جدول امتیازات
  • رویدادها
  • بازی‌های ذخیره شده
  • اتصالات نزدیک (فقط اندروید)
  • آمار بازیکن

مفاهیم

در سطح بالا، شما با دنبال کردن این مراحل از SDK استفاده می‌کنید:

  1. پیکربندی پلتفرم را برای اندروید تنظیم کنید.
  2. از یک GameServices::Builder برای پیکربندی و ساخت یک شیء GameServices استفاده کنید. شیء GameServices به طور خودکار سعی در ورود به سیستم می‌کند و نتیجه را از طریق فراخوانی OnAuthActionFinished() برمی‌گرداند. به نتیجه‌ای که توسط فراخوانی برگردانده می‌شود توجه کنید. اگر تلاش برای ورود خودکار ناموفق بود، می‌توانید دکمه‌ای را نمایش دهید تا به کاربران اجازه ورود داده شود.
  3. پس از دریافت نتیجه‌ی OnAuthActionFinished() ، می‌توانید از شیء GameServices و زیرمجموعه‌ی Managers آن برای فراخوانی سرویس‌های Play Games استفاده کنید، از جمله:

    • ورود (پس از ناموفق بودن احراز هویت): StartAuthorizationUI()
    • باز کردن قفل دستاوردها: Achievements().Unlock()
    • نمایش دستاوردها با استفاده از رابط کاربری داخلی: Achievements().ShowAllUI()
    • ارسال بالاترین امتیاز: Leaderboards().SubmitScore()
    • خروج از سیستم: SignOut()
  4. وقتی کارتان با شیء GameServices تمام شد، آن را ریست یا نابود کنید.

در سطح جزئی‌تر:

  1. مقداردهی اولیه پیکربندی پلتفرم: این شیء حاوی اطلاعات مقداردهی اولیه مختص پلتفرم است. در اندروید، پیکربندی پلتفرم شامل ماشین مجازی جاوا و یک اشاره‌گر به 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 شما وجود دارد، باقی می‌ماند؛ نیازی نیست وقتی 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. از کلاس‌های Manager برای مدیریت شیء GameServices خود استفاده کنید. مدیران از یک نمونه GameServices قابل دسترسی هستند و عملکردهای مرتبط را با هم گروه‌بندی می‌کنند. نمونه‌هایی از این موارد شامل مدیران دستاوردها و جدول امتیازات است. آن‌ها خودشان هیچ حالتی برای کاربر ندارند. مدیران با ارجاع بازگردانده می‌شوند و نمونه GameServices موجود، چرخه حیات آن‌ها را کنترل می‌کند. کلاینت شما هرگز نباید یک ارجاع Manager را نگه دارد. در عوض، کلاینت شما باید نمونه 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 که هنگام خارج شدن از محدوده، آن را به طور خودکار نابود می‌کند، آن را پاک کنید.

مدل رزوه کاری

مگر اینکه خلاف آن ذکر شده باشد، تمام متدهای GameServices و Manager دارای پیاده‌سازی‌های غیرهمزمان و thread-safe هستند. آن‌ها را می‌توان بدون قفل خارجی در هر thread فراخوانی کرد و به ترتیبی مطابق با ترتیب فراخوانی‌شان اجرا خواهند شد.

متدهای Accessor (آن‌هایی که وضعیت را می‌خوانند) در دو نوع اصلی وجود دارند. نوع اول متد (با نام‌هایی مانند FetchProperty() ) به صورت ناهمگام نتایج خود را به یک callback ارائه شده ارائه می‌دهد؛ نوع دوم (با نام‌هایی مانند FetchPropertyBlocking() ) به صورت همزمان نتایج خود را به thread فراخواننده برمی‌گرداند.

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

تمام فراخوانی‌های کاربر در یک نخ فراخوانی اختصاصی فراخوانی می‌شوند. این نخ به طور بالقوه با هر مفهوم پلتفرمی از "نخ اصلی" یا "نخ رابط کاربری" متمایز است. همچنین باید سعی کنید مطمئن شوید که فراخوانی‌های کاربر به سرعت اجرا می‌شوند. یک نخ فراخوانی متوقف شده ممکن است باعث مشکلات قابل مشاهده توسط کاربر شود (به عنوان مثال، تأخیر در تکمیل درخواست خروج).

اطلاعات مربوط به پلتفرم

برای شروع استفاده از کیت توسعه نرم‌افزاری Play Games C++ در اندروید، به راهنمای شروع سریع مراجعه کنید.

مطالعه بیشتر

برای جزئیات بیشتر، حتماً مستندات کلاس موجود در SDK مربوط به C++ سرویس‌های بازی گوگل پلی را مطالعه کنید و نمونه‌هایی را که نحوه استفاده از SDK را نشان می‌دهند، بررسی کنید.

اگر بازی شما از یک سرور پشتیبان استفاده می‌کند، به فعال کردن دسترسی سمت سرور به سرویس‌های بازی‌های گوگل پلی مراجعه کنید.