Membuat game TV

Layar televisi menghadirkan sejumlah pertimbangan yang mungkin baru bagi developer game seluler. Area ini mencakup ukurannya yang besar, skema kontrol, dan fakta bahwa semua pemain melihatnya secara bersamaan.

Tampilan

Dua hal utama yang harus diingat saat mengembangkan game untuk layar TV adalah mendesain game untuk orientasi lanskap dan memberikan dukungan untuk latensi rendah.

Mendukung tampilan lanskap

Tampilan TV selalu menyamping: Anda tidak dapat memutarnya, tidak tersedia orientasi potret. Selalu desain game TV Anda untuk ditampilkan dalam mode lanskap.

Mode latensi rendah otomatis

Layar tertentu dapat menjalankan pascapemrosesan grafik. Pascapemrosesan ini meningkatkan kualitas grafis, tetapi dapat meningkatkan latensi. Layar baru yang mendukung HDMI 2.1 memiliki mode latensi rendah otomatis (ALLM), yang meminimalkan latensi dengan menonaktifkan pasca-pemrosesan tersebut. Untuk mengetahui detail selengkapnya tentang ALLM, lihat spesifikasi HDMI 2.1. Layar lain mungkin mendukung mode game dengan perilaku serupa.

Di Android 11 dan yang lebih baru, jendela dapat meminta agar mode latensi rendah otomatis atau mode game digunakan, jika tersedia, dengan meminta pascapemrosesan minimal. Hal ini sangat berguna untuk aplikasi game dan konferensi video, dengan latensi rendah lebih penting daripada kualitas grafis terbaik.

Untuk mengaktifkan atau menonaktifkan pascapemrosesan minimal, panggil Window.setPreferMinimalPostProcessing(), atau tetapkan atribut preferMinimalPostProcessing jendela ke true. Tidak semua layar mendukung pascapemrosesan minimal; untuk mengetahui apakah layar tertentu mendukungnya, panggil metode Display.isMinimalPostProcessingSupported().

Perangkat input

TV tidak memiliki antarmuka sentuh, sehingga kontrol Anda menjadi lebih penting dan pastikan pemain menemukannya secara intuitif dan menyenangkan untuk digunakan. Menangani pengontrol juga memperkenalkan beberapa masalah lain yang perlu diperhatikan, seperti melacak beberapa pengontrol, dan menangani pemutusan sambungan dengan baik. Semua aplikasi TV, termasuk game, harus menangani pengontrol secara konsisten. Baca Mengelola pengontrol TV untuk mengetahui informasi selengkapnya tentang cara menggunakan pengontrol TV dan Menangani pengontrol untuk game untuk mengetahui informasi khusus tentang cara menggunakan pengontrol TV untuk game.

Tata letak keyboard

Di Android 13 (API level 33) dan yang lebih tinggi, Anda dapat menentukan tata letak keyboard menggunakan getKeyCodeForKeyLocation(). Misalnya, game Anda mendukung gerakan menggunakan tombol WASD, tetapi tombol ini mungkin tidak berfungsi dengan benar di keyboard AZERTY yang memiliki tombol A dan W di lokasi yang berbeda. Anda bisa mendapatkan kode kunci untuk kunci yang Anda harapkan di posisi tertentu:

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

Dalam contoh ini, dengan keyboard AZERTY, keyUp ditetapkan ke KeyEvent.KEYCODE_Z, keyLeft ditetapkan ke KeyEvent.KEYCODE_Q, sedangkan keyDown dan keyRight ditetapkan ke KeyEvent.KEYCODE_S dan KeyEvent.KEYCODE_D. Sekarang Anda dapat membuat pengendali peristiwa utama untuk kode tombol ini dan menerapkan perilaku yang diharapkan.

Manifes

Ada beberapa hal khusus yang harus disertakan game dalam manifes Android.

Menampilkan game di layar utama

Layar utama Android TV menampilkan game pada baris terpisah dari aplikasi reguler. Agar game Anda muncul dalam daftar game, tetapkan atribut android:isGame ke "true" dalam tag <application> manifes aplikasi Anda. Contoh:

<application
    ...
    android:isGame="true"
    ...
>

Mendeklarasikan dukungan untuk pengontrol game

Pengontrol game mungkin tidak tersedia atau tidak aktif bagi pengguna perangkat TV. Untuk memberi informasi yang benar kepada pengguna bahwa game Anda mendukung pengontrol game, Anda harus menyertakan entri berikut dalam manifes aplikasi:

  <uses-feature android:name="android.hardware.gamepad" android:required="false"/>

Catatan: Saat menentukan dukungan android:hardware:gamepad, jangan tetapkan atribut android:required ke "true". Jika Anda melakukannya, pengguna tidak akan dapat menginstal aplikasi Anda di perangkat TV.

Untuk mengetahui informasi selengkapnya tentang entri manifes, lihat Manifes aplikasi.

Layanan game Google Play

Jika game Anda mengintegrasikan Layanan game Google Play, Anda harus mengingat sejumlah pertimbangan yang berkaitan dengan pencapaian, login, dan penyimpanan game.

Pencapaian

Game Anda harus menyertakan minimal lima pencapaian (yang dapat diperoleh). Hanya pengguna yang mengontrol gameplay dari perangkat input yang didukung yang dapat memperoleh pencapaian. Untuk informasi selengkapnya tentang pencapaian dan cara menerapkannya, lihat Pencapaian di Android.

Login

Game Anda harus berusaha untuk membuat pengguna login pada saat peluncuran. Jika pemain menolak login beberapa kali berturut-turut, game Anda akan berhenti meminta. Pelajari login lebih lanjut di Menerapkan login di Android.

Menyimpan

Gunakan Game Tersimpan Layanan game Google Play untuk menyimpan penyimpanan game Anda. Game Anda harus mengikat penyimpanan game ke akun Google tertentu, sehingga dapat diidentifikasi secara unik bahkan di seluruh perangkat: Baik pemain menggunakan handset atau TV, game tersebut harus dapat menarik informasi penyimpanan game dari akun pengguna yang sama.

Anda juga harus menyediakan opsi pada UI game guna memungkinkan pemain menghapus data yang tersimpan di perangkat dan di cloud. Anda dapat menaruh opsi di layar Settings game. Untuk mengetahui detail cara mengimplementasikan game tersimpan menggunakan Layanan Play, lihat Game Tersimpan di Android.

Keluar

Sediakan elemen UI yang konsisten dan jelas yang memungkinkan pengguna keluar dari game dengan lancar. Elemen ini harus dapat diakses dengan tombol navigasi D-pad. Lakukan ini alih-alih mengandalkan tombol Layar Utama untuk keluar, karena hal tersebut tidak konsisten atau tidak dapat berfungsi pada pengontrol yang berbeda.

Web

Jangan mengaktifkan penjelajahan web dalam game pada Android TV. Android TV tidak mendukung browser web.

Catatan: Anda dapat menggunakan class WebView untuk login ke layanan media sosial.

Jaringan

Game kerap membutuhkan bandwidth lebih besar untuk memberikan performa yang optimal, dan banyak pengguna lebih memilih ethernet daripada WiFi untuk memberikan performa tersebut. Aplikasi Anda harus memeriksa koneksi WiFi dan ethernet. Jika aplikasi Anda hanya dikhususkan untuk TV, Anda tidak perlu memeriksa layanan 3G/LTE seperti pada aplikasi seluler.