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

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

الشاشة

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

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

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

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

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

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

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

أجهزة الإدخال

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

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

في الإصدار 13 من نظام التشغيل Android (المستوى 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 على "false" إذا كان من الممكن أيضًا تشغيل لعبتك باستخدام جهاز تحكّم عن بُعد عادي للتلفزيون (لوحة التحكّم). لا تضبط السمة android:required على القيمة "true" إلا إذا كانت لعبتك تتطلّب ذراع التحكّم في الألعاب. يؤدي ضبط السمة android:required="true" إلى عرض شارة "مطلوب جهاز تحكّم في الألعاب" وتحذير قبل التثبيت على Google Play لأجهزة Android TV، بدلاً من حظر التثبيت على أجهزة التلفزيون.

لمزيد من المعلومات حول إدخالات البيان، يُرجى الاطّلاع على بيان التطبيق.

خدمات ألعاب Google Play

إذا كانت لعبتك تتكامل مع خدمات ألعاب Google Play، عليك أن تضع في اعتبارك عددًا من الاعتبارات المتعلقة بالإنجازات وتسجيل الدخول وحفظ التقدم في الألعاب.

الإنجازات

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

تسجيل الدخول

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

جارٍ الحفظ

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

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

خروج

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

الويب

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

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

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

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