בניית משחקי טלוויזיה

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

תצוגה

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

תמיכה בתצוגה לרוחב

הטלוויזיה תמיד במצב אופקי: אי אפשר לסובב אותה, ואין מצב לאורך. תמיד צריך לעצב את המשחקים לטלוויזיה כך שיוצגו בפריסה לרוחב.

מצב זמן אחזור קצר אוטומטי

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

ב-Android מגרסה 11 ואילך, חלון יכול לבקש להשתמש במצב זמן אחזור קצר אוטומטי או במצב משחק, אם הם זמינים, על ידי בקשה לעיבוד מינימלי לאחר הצילום. האפשרות הזו שימושית במיוחד לאפליקציות של משחקים ושיחות ועידה בווידאו, שבהן זמן אחזור קצר חשוב יותר מגרפיקה באיכות הכי גבוהה.

כדי להפעיל או להשבית עיבוד מינימלי לאחר הצילום, צריך להפעיל את Window.setPreferMinimalPostProcessing(), או להגדיר את המאפיין preferMinimalPostProcessing של החלון לערך true. לא כל המסכים תומכים בעיבוד מינימלי לאחר הצילום. כדי לבדוק אם מסך מסוים תומך בכך, צריך להפעיל את השיטה Display.isMinimalPostProcessingSupported().

התקני קלט

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

פריסות מקלדת

ב-Android 13 (רמת API‏ 33) ואילך, אפשר לקבוע את פריסות המקלדת באמצעות getKeyCodeForKeyLocation(). לדוגמה, המשחק תומך בתנועה באמצעות מקשי WASD, אבל יכול להיות שהתנועה לא תפעל כמו שצריך במקלדת AZERTY, שבה המקשים A ו-W נמצאים במיקומים שונים. אתם יכולים לקבל את קודי המקשים של המקשים שאתם מצפים שיהיו במיקומים מסוימים:

Kotlin

val inputManager: InputManager? = requireActivity().getSystemService()

inputManager?.inputDeviceIds?.map { inputManager.getInputDevice(it) }
    ?.firstOrNull { it?.keyboardType == InputDevice.KEYBOARD_TYPE_ALPHABETIC }
    ?.let { inputDevice ->
        keyUp = inputDevice.getKeyCodeForKeyLocation(KeyEvent.KEYCODE_W)
        keyLeft = inputDevice.getKeyCodeForKeyLocation(KeyEvent.KEYCODE_A)
        keyDown = inputDevice.getKeyCodeForKeyLocation(KeyEvent.KEYCODE_S)
        keyRight = inputDevice.getKeyCodeForKeyLocation(KeyEvent.KEYCODE_D)
    }

Java

InputManager inputManager = requireActivity().getSystemService(InputManager.class);
InputDevice inputDevice = Arrays.stream(inputManager.getInputDeviceIds())
        .mapToObj(inputManager::getInputDevice)
        .filter( device -> device.getKeyboardType() == InputDevice.KEYBOARD_TYPE_ALPHABETIC)
        .filter(Objects::nonNull)
        .findFirst()
        .orElse(null);
if (inputDevice != null) {
    keyUp = inputDevice.getKeyCodeForKeyLocation(KeyEvent.KEYCODE_W);
    keyLeft = inputDevice.getKeyCodeForKeyLocation(KeyEvent.KEYCODE_A);
    keyDown = inputDevice.getKeyCodeForKeyLocation(KeyEvent.KEYCODE_S);
    keyRight = inputDevice.getKeyCodeForKeyLocation(KeyEvent.KEYCODE_D);
}

בדוגמה הזו, במקלדת AZERTY, הערך של keyUp מוגדר ל-KeyEvent.KEYCODE_Z, הערך של keyLeft מוגדר ל-KeyEvent.KEYCODE_Q, והערכים של keyDown ו-keyRight מוגדרים ל-KeyEvent.KEYCODE_S ול-KeyEvent.KEYCODE_D בהתאמה. עכשיו אפשר ליצור גורמים מטפלים באירועים של המקשים האלה ולהטמיע את ההתנהגות הצפויה.

מניפסט

יש כמה דברים מיוחדים שמשחקים צריכים לכלול במניפסט של Android.

הצגת המשחק במסך הבית

במסך הבית של Android TV, המשחקים מוצגים בשורה נפרדת מהאפליקציות הרגילות. כדי שהמשחק יופיע ברשימת המשחקים, צריך להגדיר את המאפיין android:isGame לערך "true" בתג <application> של קובץ המניפסט של האפליקציה. לדוגמה:

<application
    ...
    android:isGame="true"
    ...
>

הצהרה על תמיכה בשלטי משחק

יכול להיות ששלטי משחק לא יהיו זמינים או פעילים למשתמשים במכשיר טלוויזיה. כדי ליידע את המשתמשים בצורה נכונה שהמשחק תומך בשלט משחק, צריך לכלול את הרשומה הבאה בקובץ המניפסט של האפליקציה:

  <uses-feature android:name="android.hardware.gamepad" android:required="false"/>

הערה: כשמציינים תמיכה ב-android.hardware.gamepad, צריך להגדיר את המאפיין android:required לערך "false" אם אפשר לשחק במשחק גם באמצעות שלט רחוק רגיל של טלוויזיה (כפתורי החיצים). צריך להגדיר את android:required לערך "true" רק אם נדרש שלט משחק כדי לשחק במשחק. ההגדרה android:required="true" מציגה תג "נדרש שלט משחק" ואזהרה לפני ההתקנה ב-Google Play ל-Android TV, במקום לחסום את ההתקנה במכשירי טלוויזיה.

מידע נוסף על רשומות מניפסט זמין במאמר קובץ מניפסט של אפליקציה.

Google Play Games Services

אם המשחק שלכם משלב את Google Play Games Services, חשוב לזכור כמה שיקולים שקשורים להישגים, לכניסה ולשמירת משחקים.

הישגים

המשחק צריך לכלול לפחות חמישה הישגים (שאפשר להרוויח). רק משתמש ששולט בגיימפליי ממכשיר נתמך לקליטת נתונים יכול להרוויח הישגים. מידע נוסף על הישגים ועל אופן ההטמעה שלהם זמין במאמר הישגים ב-Android.

כניסה

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

מתבצעת שמירה

משתמשים בתכונה משחקים שנשמרו ב-Google Play Services כדי לאחסן את המשחק השמור. המשחק צריך לקשר את השמירות לחשבון Google ספציפי, כדי שיהיה אפשר לזהות אותן באופן ייחודי גם במכשירים שונים: לא משנה אם השחקן משתמש בטלפון או בטלוויזיה, המשחק צריך להיות מסוגל לשלוף את פרטי השמירה מאותו חשבון משתמש.

אתם צריכים גם לספק אפשרות בממשק המשתמש של המשחק כדי לאפשר לשחקן למחוק נתונים ששמורים באופן מקומי ובענן. אפשר להציב את האפשרות במסך Settings של המשחק. במאמר משחקים שמורים ב-Android מוסבר איך להטמיע משחקים שמורים באמצעות Play Services.

יציאה

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

אינטרנט

אל תפעילו גלישה באינטרנט במשחקים ל-Android TV. ב-Android TV אין תמיכה בדפדפן אינטרנט.

הערה: אפשר להשתמש במחלקה WebView להתחברות לשירותים של רשתות חברתיות.

Networking

כדי לספק ביצועים אופטימליים, משחקים צריכים לעיתים קרובות רוחב פס גדול יותר, ומשתמשים רבים מעדיפים את Ethernet על פני Wi-Fi כדי לספק את הביצועים האלה. האפליקציה צריכה לבדוק גם חיבורי Wi-Fi וגם חיבורי אתרנט. אם האפליקציה מיועדת לטלוויזיה בלבד, אין צורך לבדוק אם יש שירות 3G/LTE כמו שצריך לעשות באפליקציה לנייד.