ساختن بازی‌های تلویزیون

صفحه تلویزیون ملاحظاتی را ارائه می‌دهد که ممکن است برای توسعه‌دهندگان بازی‌های تلفن همراه جدید باشد. این زمینه‌ها شامل اندازه بزرگ آن، طرح کنترل آن، و این واقعیت است که همه بازیکنان به‌طور هم‌زمان آن را مشاهده می‌کنند.

نمایش

دو نکته اصلی که هنگام توسعه بازی برای صفحه تلویزیون باید درنظر داشته باشید، طراحی بازی برای جهت افقی و ارائه پشتیبانی از تأخیر کم است.

پشتیبانی از نمایشگر افقی

تلویزیون همیشه به‌صورت افقی است: نمی‌توانید آن را بچرخانید و جهت عمودی ندارد. همیشه بازی‌های تلویزیون را به‌گونه‌ای طراحی کنید که در حالت افقی نمایش داده شوند.

حالت تأخیر کم خودکار

برخی‌از نمایشگرها می‌توانند پس‌پردازش گرافیکی انجام دهند. این پردازش پسینی کیفیت گرافیک را بهبود می‌بخشد اما می‌تواند تأخیر را افزایش دهد. نمایشگرهای جدیدتر که از HDMI 2.1 پشتیبانی می‌کنند، دارای حالت تأخیر کم خودکار (ALLM) هستند که با خاموش کردن این پس‌پردازش، تأخیر را به حداقل می‌رساند. برای جزئیات بیشتر درباره ALLM، به مشخصات HDMI 2.1 مراجعه کنید. نمایشگرهای دیگر ممکن است از حالت بازی با عملکرد مشابه پشتیبانی کنند.

در Android 11 و نسخه‌های جدیدتر، پنجره می‌تواند با درخواست حداقل پس‌پردازش، درخواست کند که درصورت دردسترس بودن از حالت تأخیر کم خودکار یا حالت بازی استفاده شود. این ویژگی به‌ویژه برای برنامه‌های بازی و ویدیوکنفرانس مفید است، جایی که تأخیر کم از داشتن بهترین گرافیک ممکن مهم‌تر است.

برای فعال یا غیرفعال کردن حداقل پردازش پس‌از تولید، Window.setPreferMinimalPostProcessing() را فراخوانی کنید، یا مشخصه preferMinimalPostProcessing پنجره را روی true تنظیم کنید. همه نمایشگرها از حداقل پردازش پس از تولید پشتیبانی نمی‌کنند؛ برای اینکه ببینید نمایشگر خاصی از آن پشتیبانی می‌کند یا نه، روش Display.isMinimalPostProcessingSupported() را فراخوانی کنید.

دستگاه‌های ورودی

تلویزیون‌ها رابط لمسی ندارند، بنابراین مهم‌تر است که کنترل‌های خود را به‌درستی تنظیم کنید و مطمئن شوید که بازیکنان آن‌ها را بصری و سرگرم‌کننده می‌دانند. مدیریت کنترل‌کننده‌ها همچنین برخی‌از مشکلات دیگر را که باید به آن‌ها توجه کرد معرفی می‌کند، مانند پیگیری چندین کنترل‌کننده و مدیریت قطع ارتباط به‌صورت مناسب. همه برنامه‌های تلویزیون، ازجمله بازی‌ها، باید کنترل‌کننده‌ها را به‌طور یکنواخت مدیریت کنند. برای اطلاعات بیشتر درباره استفاده از کنترل‌کننده‌های تلویزیون، مدیریت کنترل‌کننده‌های تلویزیون را بخوانید و برای اطلاعات خاص درباره استفاده از کنترل‌کننده‌های تلویزیون برای بازی‌ها، مدیریت کنترل‌کننده‌های بازی را بخوانید.

جانمایی صفحه‌کلید

در Android 13 (میانای برنامه کاربردی سطح ۳۳) و بالاتر، می‌توانید چیدمان‌های صفحه‌کلید را بااستفاده از getKeyCodeForKeyLocation() تعیین کنید. برای مثال، بازی شما از حرکت بااستفاده از کلیدهای WASD پشتیبانی می‌کند، اما این ممکن است در صفحه‌کلید AZERTY که کلیدهای A و W در مکان‌های متفاوتی قرار دارند به‌درستی کار نکند. می‌توانید کدهای کلید را برای کلیدهایی که در موقعیت‌های خاص انتظار دارید دریافت کنید:

کاتلین

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)
    }

جاوا

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 مشخصه را در برچسب <application> مانیفست برنامه روی "true" تنظیم کنید. برای مثال:

<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 مراجعه کنید.

خارج شدن

عنصر میانای کاربری یکپارچه و واضحی ارائه دهید که به کاربر امکان دهد به‌آرامی از بازی خارج شود. این عنصر باید با دکمه‌های پیمایش D-pad دردسترس باشد. این کار را به‌جای تکیه بر دکمه «صفحه اصلی» برای خروج انجام دهید، زیرا این دکمه در کنترل‌کننده‌های مختلف یکسان و قابل‌اعتماد نیست.

وب

مرور وب را در بازی‌های Android TV فعال نکنید. ‫Android TV از مرورگر وب پشتیبانی نمی‌کند.

توجه: می‌توانید از کلاس WebView برای ورود به سیستم سرویس‌های رسانه‌های اجتماعی استفاده کنید.

ایجاد شبکه

بازی‌ها اغلب برای ارائه عملکرد بهینه به پهنای باند بیشتری نیاز دارند و بسیاری از کاربران برای ارائه این عملکرد، اترنت را به Wi-Fi ترجیح می‌دهند. برنامه شما باید اتصال‌های Wi-Fi و اترنت را بررسی کند. اگر برنامه شما فقط برای تلویزیون است، نیازی نیست سرویس 3G/LTE را بررسی کنید، همان‌طور که برای برنامه تلفن همراه بررسی می‌کنید.