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

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

الشاشة

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

إتاحة العرض الأفقي

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

وضع وقت الاستجابة المنخفض التلقائي

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

خروج

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

الويب

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

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

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

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