תחילת העבודה עם Play Games Services עבור C++

ערכת פיתוח התוכנה C++ Services ב-Google Play Games מספקת ממשק API ל-C++ לשימוש בשירותי המשחקים של Google Play, והיא מיועדת למפתחים שכבר יש להם הטמעה של C++ למשחק שלהם.

בשלב הזה, ה-SDK מטמיע את השירותים הבאים:

  • הרשאה
  • הישגים
  • לוחות לידרבורד
  • אירועים
  • משחקים שמורים
  • חיבורים בקרבת מקום (Android בלבד)
  • נתונים סטטיסטיים של שחקן

מושגים

ברמה גבוהה, עליך להשתמש ב-SDK על ידי ביצוע השלבים הבאים:

  1. הגדרת תצורה לפלטפורמה ב-Android.
  2. בעזרת GameServices::Builder אפשר להגדיר ולבנות אובייקט GameServices. האובייקט GameServices ינסה להיכנס באופן אוטומטי ויחזיר את התוצאה באמצעות קריאה חוזרת (callback) ב-OnAuthActionFinished(). שימו לב לתוצאה שהוחזרו על ידי הלקוח. אם ניסיון הכניסה האוטומטי נכשל, תוכלו להציג לחצן שמאפשר למשתמשים להיכנס.
  3. אחרי שמתקבלת התוצאה OnAuthActionFinished(), אפשר להשתמש באובייקט GameServices ובמנהלים הצאצאים שלו כדי להתקשר לשירותי Play Games, כולל:

    • כניסה (לאחר שההרשאה נכשלה): StartAuthorizationUI()
    • קבלת הישגים: Achievements().Unlock()
    • הצגת הישגים באמצעות ממשק משתמש מובנה: Achievements().ShowAllUI()
    • דירוג גבוה: Leaderboards().SubmitScore()
    • יציאה: SignOut()
  4. בסיום השימוש באובייקט GameServices, יש לאפס או להשמיד אותו.

ברמה מפורטת יותר:

  1. אתחול של הגדרות פלטפורמה: זהו אובייקט שמכיל מידע על אתחול ספציפי לפלטפורמה. ב-Android, תצורת הפלטפורמה מכילה את Java VM והפניה ל-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 Games Services. 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. כדי לנהל את האובייקט של 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 שהוא הבעלים שלו, או על ידי מתן אפשרות ל-unique_ptr להשמיד אותו באופן אוטומטי מחוץ לטווח.

מודל שרשור

אלא אם צוין אחרת, בכל השיטות של GameServices וב-Manager יש הטמעות אסינכרוניות בטוחות לשרשורים. אפשר לקרוא להם בכל שרשור ללא נעילה חיצונית, והם יבוצעו בסדר שתואם לסדר ההפעלה שלהם.

שיטות הגישה (אלו שמשמשות את מצב הקריאה) מגיעות בשתי גרסאות עיקריות. הסוג הראשון של השיטה (עם שמות כמו FetchProperty()) מספק באופן אסינכרוני את התוצאות שלה לקריאה חוזרת (callback) שנייה; הסוג השני (עם שמות כמו 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);});

כל הקריאות החוזרות (callbacks) של המשתמשים מופעלות בשרשור התקשרות ייעודי. השרשור הזה עשוי להיות שונה מקונספט של פלטפורמה כמו "שרשור ראשי" או "ממשק משתמש". כמו כן, כדאי לוודא שהקריאות החוזרות (callbacks) של המשתמשים מתבצעות במהירות, מפני ששרשור שיחה מושהה עלול לגרום לבעיות שהן גלויות למשתמשים (לדוגמה, איחור בהשלמת בקשה ליציאה).

מידע ספציפי לפלטפורמה

כדי להתחיל להשתמש ב-C++ SDK של Play Games ב-Android, עיינו במדריך למתחילים.

קריאה נוספת

לקבלת פרטים נוספים, קראו את התיעוד לשיעור שמופיע ב-SDK של 'שירותי המשחקים של Google Play' ב-C++ SDK. תוכלו גם לעיין בדוגמאות שממחישות את השימוש ב-SDK.

אם המשחק שלכם משתמש בשרת עורפי, קראו את המאמר הפעלת גישה בצד השרת לשירותי Google Play Games.