تصميم ألعاب تلفزيونية

تعرض شاشة التلفزيون بعض النقاط التي قد تكون غير مرتبطة بمطوّري الألعاب على الأجهزة الجوّالة. وتشمل هذه المساحات حجمه الكبير ونظام التحكّم فيه، بالإضافة إلى أنّ جميع اللاعبين يشاهدونه في الوقت نفسه.

الشاشة

هناك أمران أساسيان يجب أخذهما في الاعتبار عند تطوير الألعاب لشاشات التلفزيون، وهما تصميم لعبتك في اتجاه أفقي وتوفير وقت استجابة سريع.

دعم العرض الأفقي

يكون التلفزيون دائمًا بانحراف: لا يمكنك تدويره ولا يوجد اتجاه عمودي. صمِّم ألعابك التلفزيونية دائمًا لعرضها في الوضع الأفقي.

وضع وقت الاستجابة السريع التلقائي

يمكن لبعض الشاشات إجراء عملية ما بعد معالجة الرسومات. تؤدي عملية ما بعد المعالجة هذه إلى تحسين جودة الرسومات، ولكنّها قد تزيد من وقت الاستجابة. الشاشات الأحدث التي تتوافق مع HDMI 2.1 مزوّدة بوضع وقت الاستجابة السريع التلقائي (ALLM)، ما يقلّل من وقت الاستجابة عن طريق إيقاف عملية ما بعد المعالجة هذه. للحصول على مزيد من التفاصيل حول ALLM، يمكنك مراجعة مواصفات HDMI 2.1. وقد تتوافق الشاشات الأخرى مع وضع الألعاب ذي السلوك نفسه.

في نظام التشغيل Android 11 والإصدارات الأحدث، يمكن أن تطلب النافذة استخدام وضع وقت الاستجابة السريع التلقائي أو وضع اللعبة إن وُجد من خلال طلب الحد الأدنى من عمليات المعالجة اللاحقة. ويُعدّ هذا الإجراء مفيدًا بشكل خاص لتطبيقات الألعاب ومؤتمرات الفيديو، حيث يكون وقت الاستجابة المنخفض أكثر أهمية من توفُّر أفضل الرسومات الممكنة.

لتفعيل الحدّ الأدنى من عمليات المعالجة اللاحقة أو إيقافها، يمكنك طلب الرمز Window.setPreferMinimalPostProcessing() أو ضبط سمة preferMinimalPostProcessing للنافذة على true. لا تتيح بعض الشاشات الحد الأدنى من عمليات المعالجة اللاحقة، لمعرفة ما إذا كانت شاشة معيّنة تتيح ذلك، استخدِم الطريقة Display.isMinimalPostProcessingSupported().

أجهزة إدخال البيانات

لا تتضمن أجهزة التلفزيون واجهات تعمل باللمس، لذا من المهمّ أن تكون عناصر التحكّم صحيحة وتتأكّد من أنّ اللاعبين يجدونها سهلة الاستخدام وممتعة. تقدّم وحدات التحكّم في التعامل مع البيانات أيضًا بعض المشاكل الأخرى التي يجب الانتباه إليها، مثل تتبُّع عدة وحدات تحكّم، وانقطاع الاتصال بطريقة سلسة. يجب أن تتعامل جميع تطبيقات التلفزيون، بما في ذلك الألعاب، مع وحدات التحكّم بشكل منتظم. اقرأ إدارة وحدات التحكم في التلفزيون للحصول على مزيد من المعلومات عن استخدام وحدات التحكم في التلفزيون ووحدات التحكم بالمقبض للألعاب للحصول على معلومات محدّدة عن استخدام وحدات التحكم في التلفزيون للألعاب.

تخطيطات لوحة المفاتيح

في نظام التشغيل Android 13 (المستوى 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، يجب مراعاة بعض الاعتبارات المتعلّقة بالإنجازات وتسجيل الدخول وحفظ الألعاب.

الإنجازات

يجب أن تتضمّن لعبتك خمسة إنجازات (قابلة للتحقيق) على الأقل. ولا يمكن تحقيق الإنجازات إلا من خلال المستخدم الذي يتحكّم في أسلوب اللعب من جهاز إدخال متوافق. لمزيد من المعلومات حول الإنجازات وكيفية تنفيذها، يمكنك الاطّلاع على الإنجازات في نظام Android.

تسجيل الدخول

يجب أن تحاول لعبتك تسجيل دخول المستخدم عند التشغيل. وإذا رفض اللاعب تسجيل الدخول عدة مرات على التوالي، يجب أن تتوقف اللعبة عن طلب تسجيل الدخول. اطّلِع على مزيد من المعلومات حول عملية تسجيل الدخول على الرابط تنفيذ ميزة تسجيل الدخول على أجهزة Android.

جارٍ الحفظ…

استخدِم الألعاب المحفوظة في "خدمات Google Play" لتخزين التقدُّم المحفوظ في ألعابك. يجب أن تربط لعبتك عمليات حفظ اللعبة في حساب معيّن على Google، وذلك ليتمكّن من التعرّف عليها بشكل فريد حتى على مختلف الأجهزة: وسواء كان اللاعب يستخدم هاتفًا ذكيًا أو تلفزيونًا، يجب أن تكون اللعبة قادرة على الحصول على معلومات حفظ اللعبة من حساب المستخدم نفسه.

عليك أيضًا توفير خيار في واجهة مستخدم اللعبة يتيح للّاعب حذف البيانات على الجهاز والبيانات المخزَّنة في السحابة الإلكترونية. ويمكنك عرض الخيار في شاشة "Settings" الخاصة باللعبة. للحصول على تفاصيل حول تنفيذ الألعاب المحفوظة باستخدام "خدمات Play"، يمكنك الاطّلاع على الألعاب المحفوظة في Android.

خروج

توفير عنصر واجهة مستخدم متسق وواضح يتيح للمستخدم الخروج من اللعبة بسلاسة. يجب الوصول إلى هذا العنصر باستخدام أزرار التنقل في لوحة التحكم. افعل ذلك بدلاً من الاعتماد على زر الشاشة الرئيسية لتوفير مخرج، لأن ذلك غير متسق ولا موثوق به عبر وحدات التحكم المختلفة.

محتوى مخصص للويب

عدم تفعيل تصفُّح الويب في الألعاب على Android TV لا يتوافق Android TV مع متصفح ويب.

ملاحظة: يمكنك استخدام الفئة WebView لتسجيل الدخول إلى خدمات وسائل التواصل الاجتماعي.

اتصال بالشبكات

غالبًا ما تحتاج الألعاب إلى معدل نقل بيانات أكبر لتوفير الأداء الأمثل، ويفضّل العديد من المستخدمين استخدام الإيثرنت على شبكة Wi-Fi لتوفير هذا الأداء. يجب أن يتحقق التطبيق من اتصال كل من شبكة WiFi واتصال الإيثرنت. إذا كان تطبيقك مخصصًا للتلفزيون فقط، فلا تحتاج إلى التحقق من خدمة شبكة الجيل الثالث (3G) / LTE كما هو الحال مع تطبيق الأجهزة الجوّالة.