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

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

الشاشة

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

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

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

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

يمكن لبعض الشاشات تنفيذ معالجة ما بعد معالجة الرسومات. تعمل هذه المعالجة اللاحقة على تحسين جودة الرسومات ولكن يمكن أن تزيد من وقت الاستجابة. تتضمّن الشاشات الأحدث التي تتوافق مع 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 لتوفير هذا الأداء. يجب أن يتحقق التطبيق من وجود كل من اتصال Wi-Fi والإيثرنت. إذا كان تطبيقك مخصصًا للتلفزيون فقط، لن تحتاج إلى البحث عن خدمة شبكة الجيل الثالث/LTE كما تفعل مع تطبيق للأجهزة الجوّالة.