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

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

מסך

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

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

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

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

מסכים מסוימים יכולים לבצע עיבוד גרפי לאחר העיבוד. העיבוד לאחר הצגה משפר את איכות הגרפיקה, אבל יכול להאריך את זמן האחזור. במסכים חדשים יותר שתומכים ב-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 לערך "true". אם תעשו זאת, המשתמשים לא יוכלו להתקין את האפליקציה שלכם במכשירי טלוויזיה.

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

שירותי המשחקים של Google Play

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

הישגים

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

כניסה

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

שומר

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

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

יציאה

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

אינטרנט

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

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

רשתות

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