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

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

الشاشة

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

أن تتيح العرض في الوضع الأفقي

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

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

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

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

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

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

الإنجازات

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

تسجيل الدخول

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

جارٍ الحفظ…

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

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

الخروج

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

الويب

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

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

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

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