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

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

الشاشة

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

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

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

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

يمكن لبعض الشاشات إجراء معالجة لاحقة للرسومات. تحسّن هذه المعالجة اللاحقة جودة الرسومات ولكنها قد تزيد من وقت الاستجابة. تتضمّن الشاشات الأحدث التي تتيح استخدام HDMI 2.1 وضع وقت الاستجابة السريع التلقائي (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 في اللعبة. للحصول على تفاصيل حول تنفيذ ميزة "حفظ التقدم في الألعاب" باستخدام "خدمات Play"، يُرجى الاطّلاع على مقالة حفظ التقدم في الألعاب على Android.

خروج

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

الويب

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

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

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

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