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

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

الشاشة

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

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

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

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

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

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

لتفعيل الحد الأدنى من المعالجة اللاحقة أو إيقافها، استخدِم الدالة 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 الخاصة باللعبة. للحصول على تفاصيل حول تنفيذ ميزة &quot;حفظ التقدم في الألعاب&quot; باستخدام &quot;خدمات Play&quot;، يُرجى الاطّلاع على حفظ التقدم في الألعاب على Android.

خروج

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

الويب

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

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

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

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