Mengembangkan game untuk semua layar

Saat mengembangkan game untuk Android, Anda harus mengantisipasi beragam kemungkinan pengalaman pemain dan tetap adaptif dengan kebutuhan interaksi real-time pemain. Dengan mendukung pengalaman yang beragam bagi pemain, Anda akan meningkatkan fleksibilitas game sehingga jangkauan game pun semakin luas.

Perbedaan spesifik pada pengalaman pemain meliputi beberapa hal berikut:

  • Faktor bentuk perangkat: Meskipun orang pada umumnya menggunakan Android dari ponsel, game mungkin dimainkan pada perangkat dengan faktor bentuk lain. Perangkat ChromeOS dapat menjalankan container Android yang menampilkan game Anda. Tablet yang dapat menjalankan Android mendukung berbagai tingkat fidelitas. Perangkat Android TV mendukung pengalaman yang lebih mendetail dan lebih imersif. Pemain dapat menyimulasikan lingkungan multi-aplikasi menggunakan fitur ekstensi tampilan. Dan jika menggunakan perangkat foldable, pemain dapat mengubah ukuran layar selama sesi bermain game.
  • Metode interaksi: Pemain dapat memberikan input dengan menyentuh layar perangkat, pemain juga dapat menggunakan mouse, touchpad, keyboard, atau pengontrol. Selain itu, dengan adanya alat ekstensi layar dan perangkat foldable, pemain dapat merasakan pengalaman bermain game pada layar yang lebih besar. Ini memperpanjang sesi bermain dan memungkinkan antarmuka yang lebih kompleks.
  • Dukungan hardware: Beberapa perangkat Android tidak memiliki hardware yang umumnya ada pada perangkat genggam, seperti kamera belakang, GPS, dan konektivitas jaringan. Game Anda harus menyesuaikan dengan hardware yang tersedia dan menangani situasi dengan baik jika fitur tertentu tidak tersedia.

Panduan ini menyajikan praktik terbaik terkait dengan mengembangkan game untuk berbagai jenis layar dan interaksi pengguna. Panduan ini juga memberikan saran untuk mendesain game dan mengembangkan strategi pengujian yang efektif.

Praktik terbaik desain game

Saat merencanakan desain dan arsitektur game, ikuti praktik terbaik yang dijelaskan pada bagian berikut.

Menanggapi perubahan konfigurasi secara manual

Jika sistem Android mendeteksi perubahan konfigurasi, seperti perubahan pada ukuran layar, orientasi layar, atau metode input, sistem ini secara default akan memulai ulang aktivitas saat ini. Untuk mempertahankan status dalam aplikasi atau game, aktivitas secara default memanggil onSaveInstanceState() sebelum dimulai ulang dan onRestoreInstanceState() setelah dimulai ulang. Namun, proses ini membutuhkan aktivitas untuk memuat ulang semua layanan dan resource terkait. Untuk mempelajari perilaku default ini lebih lanjut, lihat panduan dalam menangani perubahan konfigurasi.

Setiap sesi bermain game biasanya mengalami beberapa perubahan konfigurasi. Jika yang menangani setiap perubahan konfigurasi adalah sistem dan bukan game Anda, scene dalam game akan ditutup dan dimulai ulang berulang kali sehingga menurunkan performa game. Karena itu, kami sangat menyarankan Anda untuk menangani sendiri perubahan konfigurasi dalam game.

Untuk mempelajari cara menambahkan logika perubahan konfigurasi ini ke dalam game, lihat bagian tentang cara membuat pengendali perubahan konfigurasi kustom.

Membuat arsitektur fleksibel

Guna menambahkan dukungan untuk game di sebanyak mungkin perangkat, ikuti beberapa praktik terbaik ini:

  • Men-deploy Android App Bundle, bukan APK individual. Android App Bundle memungkinkan Anda mengemas artefak dari berbagai resolusi dan model arsitektur yang berbeda, seperti x86, ARM, menjadi satu artefak. Selain itu, Android App Bundle mendukung batas ukuran yang lebih besar untuk game; setiap APK dasar dapat berukuran hingga 150 MB, dan bundle itu sendiri dapat berukuran banyak gigabyte.
  • Menambahkan dukungan untuk arsitektur x86. Langkah ini meningkatkan performa game pada perangkat yang tidak mendukung ARM, karena perangkat ini kini dapat menjalankan instruksi tanpa harus menerjemahkannya terlebih dahulu.

Menambahkan dukungan untuk Vulkan

Dengan mendukung Vulkan, game Anda dapat mencapai performa grafis yang lebih tinggi. Kebanyakan perangkat mendukung API grafis ini.

Membuat pengendali perubahan konfigurasi kustom

Untuk mendeklarasikan jenis perubahan konfigurasi yang ditangani game Anda sendiri, tambahkan atribut android:configChanges ke setiap elemen <activity> dalam manifes yang mewakili layar atau antarmuka yang kompleks.

Cuplikan kode berikut menunjukkan cara mendeklarasikan bahwa game Anda menangani perubahan ukuran layar, orientasi layar, dan metode input:

<activity ...
    android:configChanges="screenSize|orientation|keyboard|keyboardHidden">
</activity>

Saat perubahan konfigurasi yang dideklarasikan terjadi, sistem kini memanggil metode lain, onConfigurationChanged(). Dalam metode ini, tambahkan logika untuk memperbarui UI game Anda:

Menangani perubahan konfigurasi layar

Game Anda menangani perubahan ukuran layar dan orientasi layar secara manual setiap kali Anda menyertakan nilai screenSize dan orientation, dalam atribut android:configChanges. Nilai-nilai baru tersebut dapat digunakan untuk memperbarui area input pemain dan konten scene. Untuk panduan tentang cara mendesain tata letak game agar lebih mudah diperbarui, lihat panduan cara mendukung berbagai ukuran layar.

Dalam penerapan onConfigurationChanged() pada game Anda, gunakan objek Configuration dan objek Display pengelola jendela yang dimasukkan untuk menentukan nilai baru ukuran dan orientasi layar.

Cuplikan kode berikut menunjukkan cara mendapatkan orientasi dan ukuran layar yang telah diperbarui pada game Anda:

Kotlin

override fun onConfigurationChanged(newConfig: Configuration) {
    super.onConfigurationChanged(newConfig)
    val density: Float = resources.displayMetrics.density
    val newScreenWidthPixels = (newConfig.screenWidthDp * density).toInt()
    val newScreenHeightPixels = (newConfig.screenHeightDp * density).toInt()

    // Get general orientation; either Configuration.ORIENTATION_PORTRAIT or
    // Configuration.ORIENTATION_LANDSCAPE.
    val newScreenOrientation: Int = newConfig.orientation

    // Get general rotation; one of: ROTATION_0, ROTATION_90, ROTATION_180,
    // or ROTATION_270.
    val newScreenRotation: Int = windowManager.defaultDisplay.rotation
}

Java

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    float density = getResources().getDisplayMetrics().density;
    int newScreenWidthPixels = (int) (newConfig.screenWidthDp * density);
    int newScreenHeightPixels = (int) (newConfig.screenHeightDp * density);

    // Get general orientation; either Configuration.ORIENTATION_PORTRAIT or
    // Configuration.ORIENTATION_LANDSCAPE.
    int newScreenOrientation = newConfig.orientation;

    // Get general rotation; one of: ROTATION_0, ROTATION_90, ROTATION_180,
    // or ROTATION_270.
    int newScreenRotation = getWindowManager().getDefaultDisplay()
            .getRotation();
}

Perlu diketahui bahwa perubahan pose perangkat foldable akan mengubah konfigurasi, meskipun aplikasi berjalan dalam mode layar penuh. Akibatnya, aplikasi Anda mungkin harus menangani perubahan ukuran layar atau kepadatan piksel jika pengguna melipat atau membuka lipatan perangkat saat game sedang berjalan.

Kualitas layar khusus game

Bagian berikut menjelaskan cara menyesuaikan reaksi game terhadap perubahan ukuran atau orientasi layar, yang bergantung pada kualitas game:

Mode layar penuh

Pada beberapa platform, seperti ChromeOS, aplikasi dan game Android dapat di-jendela dan dapat diubah ukurannya secara {i>default<i}. Jika game Anda harus selalu berjalan dalam mode layar penuh, Anda dapat menyetel atribut android:resizeableActivity ke false di salah satu elemen <activity>, seperti yang ditunjukkan dalam cuplikan kode berikut:

<activity ...
    android:resizeableActivity="false">
</activity>

Anda juga dapat menetapkan atribut android:resizeableActivity ke false untuk mencegah terjadinya perubahan konfigurasi berdasarkan ukuran. Akan tetapi, kecuali game Anda selalu berjalan dalam mode layar penuh, Anda harus menambahkan atribut ini sebagai solusi sementara untuk tujuan pengujian.

Orientasi layar

Jika game Anda menggunakan sensor perangkat untuk mengharuskan orientasi tertentu, tentukan nilai untuk android:screenOrientation dalam aktivitas game, seperti yang ditunjukkan dalam cuplikan kode berikut. Setelan ini membantu mencegah scene dalam game Anda terbalik secara tiba-tiba.

<activity ...
    android:screenOrientation="landscape">
</activity>

Kualitas layar khusus perangkat

Bagian berikut menjelaskan cara menangani perubahan konfigurasi berbasis layar berdasarkan kualitas tertentu yang dimiliki beberapa perangkat.

Rasio lebar tinggi

Beberapa perangkat mendukung berbagai rasio lebar tinggi. Misalnya, perangkat foldable dirancang untuk mendukung rasio lebar tinggi 21:9 saat dalam kondisi terlipat. Untuk menangani berbagai kemungkinan rasio lebar tinggi, lakukan setidaknya satu tindakan berikut:

  • Targetkan Android 8.0 (API level 26) atau yang lebih baru.
  • Pastikan antarmuka dan scene game Anda dapat diubah ukurannya. Tetapkan android:resizeableActivity ke true di perangkat yang menjalankan Android 7.0 (API level 24) dan yang lebih baru.
  • Deklarasikan rasio lebar tinggi maksimum yang didukung. Pada atribut <meta-data> yang terkait dengan game Anda, setel android.max_aspect ke 2.4, seperti yang ditunjukkan dalam cuplikan kode berikut. Namun, perhatikan bahwa rasio lebar tinggi yang lebih besar dari yang Anda tentukan akan menyebabkan game disajikan dalam tampilan lebar pada layar.

    <application>
    <meta-data android:name="android.max_aspect"
               android:value="2.4" />
    </application>
    

Beberapa aktivitas terlihat secara bersamaan

Banyak perangkat mendukung berbagai tata letak layar, termasuk layar terpisah, picture-in-picture, dan area tampilan besar. Saat menggunakan salah satu tata letak ini, sistem dapat membuat beberapa aktivitas yang terlihat pada saat yang sama.

Pada perangkat yang menjalankan Android 9 (API level 28) atau yang lebih baru, semua aktivitas teratas yang terlihat dapat dilanjutkan pada saat yang sama. Namun, agar perilaku ini berfungsi, baik game Anda maupun OEM perangkat harus memilih fungsi tersebut. Anda dapat menambahkan dukungan dalam game dengan menyetel android.allow_multiple_resumed_activities ke true di manifes game, seperti yang ditampilkan dalam cuplikan berikut:

<application>
    <meta-data android:name="android.allow_multiple_resumed_activities"
               android:value="true" />
</application>

Selanjutnya, Anda dapat menguji game di berbagai perangkat guna mengetahui perangkat mana yang menyediakan dukungan OEM yang diperlukan agar multi-resume berfungsi dengan baik.

Untuk informasi selengkapnya tentang cara mengonfigurasi game Anda agar muncul sebagai bagian dari tampilan multi-aplikasi, lihat panduan cara menambahkan dukungan multi-aplikasi.

Menangani berbagai jenis model interaksi

Game Anda menangani keberadaan dan ketersediaan keyboard secara manual setiap kali Anda menyertakan nilai keyboard dan keyboardHidden, dalam atribut android:configChanges. Anda dapat menggunakan nilai baru ini untuk memperbarui metode input utama game Anda.

Saat mengonfigurasi game untuk mendukung beberapa jenis input pengguna, ingat hal berikut:

  • Deteksi metode input daripada perangkat individu. Pola pikir ini membuatnya lebih mudah untuk meningkatkan pengalaman pemain tanpa terlalu fokus pada perangkat tertentu yang mungkin dimiliki pemain.
  • Sertakan atribut keyboardHidden dalam daftar perubahan konfigurasi yang ditangani secara manual. Dengan begitu, game Anda dapat melacak saat keyboard terpasang secara fisik ke perangkat, tetapi tidak dapat digunakan.
  • Tentukan metode input yang saat ini tersedia. Untuk melakukannya, panggil getInputDeviceIds() saat memulai game dan setelah setiap perubahan konfigurasi.

    Anda dapat menentukan bagaimana pemain berencana untuk berinteraksi dengan game berdasarkan perangkat input yang mereka pilih:

    • Pemain biasanya menggunakan keyboard atau pengontrol game untuk menekan urutan tombol cepat.
    • Pemain biasanya menggunakan touchscreen atau touchpad untuk melakukan gestur yang lebih rumit.
    • Pemain biasanya menggunakan input presisi lebih tinggi.

Bagian berikut memberikan praktik terbaik untuk jenis perangkat input tertentu.

Keyboard

Saat membuat tata letak keyboard untuk game, pertimbangkan cara pemain melihat scene tertentu dan berinteraksi dengan setelan game.

Tombol WASD atau tombol panah paling optimal digunakan untuk mengontrol gerakan karakter. Sebaiknya juga tetapkan tombol khusus untuk setiap skill atau aksi penting yang dapat dilakukan karakter yang dapat dikontrol dalam game. Demi memaksimalkan pengalaman pemain, pertimbangkan untuk menambahkan dukungan untuk binding tombol kustom pada game Anda.

Pemain juga harus dapat membuka menu game dan memilihnya menggunakan keyboard. Tombol Esc adalah pemetaan umum untuk menjeda adegan dan menampilkan menu game.

Untuk informasi selengkapnya tentang cara mendukung input keyboard dalam game, lihat panduan cara mendukung navigasi keyboard serta panduan cara menangani tindakan keyboard.

Pengontrol game

Untuk informasi selengkapnya tentang cara menangani input pengontrol dalam game, lihat panduan cara mendukung pengontrol game.

Mouse atau touchpad

Jika game Anda mendukung input pemain dari mouse atau touchpad, ingat bahwa pemain berinteraksi dengan perangkat menggunakan berbagai cara selain memainkan game. Penting diketahui bahwa dengan meminta gambar penunjuk, semua input mouse diarahkan ke game Anda. Oleh karena itu, setelah game Anda memiliki informasi yang dibutuhkan, tampilkan gambar penunjuk agar pemain mendapatkan kembali kontrol mouse standar perangkatnya.

Di perangkat yang menjalankan Android 8.0 (API level 26) dan yang lebih baru, Anda dapat menggunakan Mouse Capture API untuk membantu proses gambar penunjuk. Dalam game yang merespons input presisi tinggi, Anda dapat memperoleh koordinat penunjuk saat ini dengan memanggil metode getX() dan getY().

Untuk informasi tambahan tentang cara menambahkan dukungan untuk input mouse dan touchpad dalam game, lihat panduan cara melacak gerakan penunjuk serta panduan cara menangani gestur multi-kontrol.

Menguji game Anda

Sebelum meluncurkan game, uji tanggapan game terhadap perubahan konfigurasi dengan menyelesaikan langkah-langkah yang dijelaskan di bagian berikut:

Memperbarui rencana pengujian

Saat memvalidasi fungsionalitas game, cantumkan kasus pengujian berikut:

  • Perkecil dan perbesar jendela yang berisi game Anda. (Tidak berlaku jika game selalu dalam mode layar penuh.)
  • Ubah ukuran layar.
  • Ubah orientasi layar. (Tidak berlaku jika game memiliki orientasi tetap.)
  • Sambungkan dan lepaskan sambungan perangkat input, seperti keyboard dan mouse.
  • Lakukan multi-resume, jika game mendukungnya.

Selain itu, pertimbangkan untuk mengupdate sistem kontrol kualitas game agar Anda dapat mengoptimalkan beragam pengalaman pemain yang lebih luas.

Untuk praktik terbaik terkait pengujian game, lihat panduan Dasar-Dasar Pengujian.

Menggunakan fitur pengujian dan proses debug

Anda dapat melakukan pengujian menggunakan berbagai alat yang didukung platform: