Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.

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 pemain yang beragam, Anda meningkatkan fleksibilitas alur game yang akan membantu memperluas jangkauan game Anda.

Perbedaan spesifik pada pengalaman pemain meliputi beberapa hal berikut:

  • Faktor bentuk perangkat: Meskipun ponsel memberikan pengalaman perangkat Android tradisional, ponsel dapat berinteraksi dengan game pada faktor bentuk lainnya. Perangkat Chrome OS dapat menjalankan container Android yang menampilkan game. Tablet yang dapat menjalankan Android mendukung berbagai tingkat fidelitas. Perangkat Android TV mendukung pengalaman yang lebih mendetail dan lebih mendalam. Pemain dapat menyimulasikan lingkungan multi-aplikasi menggunakan fitur ekstensi tampilan. Dan jika menggunakan perangkat foldable, pemain dapat mengubah ukuran layar selama sesi alur game.
  • Metode interaksi: Pemain dapat menyediakan input dengan menyentuh layar perangkat, pemain juga bisa menggunakan mouse, touchpad, keyboard,atau pengontrol. Selain itu, ketersediaan fitur ekstensi tampilan dan perangkat foldable memungkinkan pemain merasakan pengalaman bermain game pada layar yang lebih besar, sehingga membuat sesi alur game jadi lebih lama, dan antarmuka yang lebih rumit menjadi lebih mudah.
  • 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 akan 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.

Sesi alur game standar mengalami beberapa perubahan konfigurasi. Jika game memungkinkan sistem menangani setiap perubahan konfigurasi, scene game akan ditutup dan dimulai ulang berulang kali sehingga menurunkan performa game Anda. Dengan alasan inilah, kami sangat menyarankan Anda untuk menangani sendiri perubahan konfigurasi pada game Anda.

Untuk mempelajari cara menambahkan logika perubahan konfigurasi ini ke game Anda, 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 alih-alih APK individu. Android App Bundle memungkinkan Anda mengemas artefak dari berbagai resolusi dan model arsitektur yang berbeda, seperti x86, ARM, menjadi satu artefak. Lebih baik lagi, Android App Bundle mendukung batas ukuran yang lebih tinggi; masing-masing APK dasar bisa berukuran 150 MB, dan bundle sendiri bisa memiliki ukuran gigabyte yang besar.
  • Menambahkan dukungan untuk arsitektur x86. Langkah ini meningkatkan performa game Anda pada perangkat yang tidak mendukung ARM, karena perangkat ini sekarang bisa 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 untuk setiap elemen <activity> dalam manifes Anda yang merepresentasikan layar atau antarmuka yang rumit.

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>
    

Jika terjadi perubahan konfigurasi yang dideklarasikan, sistem akan memanggil metode yang berbeda, 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 mencantumkan nilai screenSize dan orientation, pada atribut android:configChanges. Nilai-nilai baru tersebut bisa Anda gunakan untuk memperbarui area input pemain dan konten scene. Untuk panduan tentang cara mendesain layout game agar lebih mudah diperbarui, lihat panduan cara mendukung berbagai ukuran layar.

Dalam implementasi onConfigurationChanged() game Anda, gunakan objek Configuration yang diteruskan dan objek Display window manager untuk menentukan nilai untuk masing-masing ukuran dan orientasi layar yang telah diperbarui.

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

Kualitas layar khusus game

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

Mode layar penuh

Pada beberapa platform, seperti Chrome OS, aplikasi dan game Android dapat memiliki jendela dan dapat diubah ukurannya secara default. Jika game Anda harus selalu berjalan dalam mode layar penuh, Anda dapat menetapkan atribut android:resizeableActivity ke false pada salah satu elemen <activity>, seperti yang ditampilkan pada cuplikan kode berikut:

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

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

Orientasi layar

Jika game Anda bergantung pada sensor perangkat yang memiliki orientasi tertentu, tentukan nilai untuk android:screenOrientation pada aktivitas game, seperti yang ditampilkan pada 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 tinggi lebar

Beberapa perangkat mendukung berbagai rasio tinggi lebar. Misalnya, perangkat foldable didesain untuk mendukung rasio tinggi lebar 21:9 saat dalam kondisi terlipat. Untuk menangani berbagai potensi pada rasio tinggi lebar, 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 pada perangkat yang menjalankan Android 7.0 (API level 24) dan yang lebih baru.
  • Mendeklarasikan rasio tinggi lebar maksimum yang didukung. Pada atribut <meta-data> yang terkait dengan game Anda, tetapkan android.max_aspect ke 2.4, seperti yang ditampilkan pada cuplikan kode berikut. Namun, perhatikan bahwa rasio tinggi lebar lebih besar dari yang Anda tentukan karena game tersebut akan memunculkan tampilan lebar dalam tampilan.

        <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 menetapkan android.allow_multiple_resumed_activities ke true dalam manifes game, seperti yang ditampilkan pada cuplikan kode 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 mencantumkan nilai keyboard dan keyboardHidden, pada 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 waktu keyboard terpasang secara fisik ke perangkat tetapi tidak dapat digunakan.
  • Tentukan metode input yang saat ini tersedia. Untuk melakukannya, panggil getInputDeviceIds() pada startup game dan setelah perubahan konfigurasi.

    Anda bisa menentukan bagaimana pemain berencana untuk berinteraksi dengan game Anda 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 Anda.

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

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

Untuk informasi selengkapnya tentang cara mendukung input keyboard, lihat panduan cara mendukung navigasi keyboard dan panduan cara menangani tindakan keyboard.

Pengontrol game

Saat tersambung ke perangkat Android, pengontrol game berfungsi sebagai keyboard dengan tata letak khusus. Gunakan InputDevice, KeyEvent, dan MotionEvent API untuk meneruskan peristiwa dan nama perangkat, melihat pemetaan kunci, dan mengontrol info via sentuhan.

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 untuk diketahui bahwa, dengan meminta tangkapan pointer, semua input mouse diarahkan ke game Anda. Oleh karena itu, setelah game Anda memiliki informasi yang dibutuhkan, berikan tangkapan pointer agar pemain mendapatkan kembali kontrol mouse standar perangkatnya.

Pada perangkat yang menjalankan Android 8.0 (API level 26) dan yang lebih baru, Anda dapat menggunakan Mouse Capture API untuk membantu proses tangkapan pointer. Dalam game yang bisa bereaksi dengan input presisi tinggi, Anda bisa mendapatkan koordinat pointer saat ini dengan memanggil metode getX() dan getY().

Untuk informasi tambahan mengenai penambahan dukungan untuk input mouse dan input touchpad dalam game Anda, lihat panduan tentang cara melacak gerakan pointer serta panduan tentang cara menangani gestur multisentuh.

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.

Juga, pertimbangkan untuk memperbarui sistem kontrol kualitas game, sehingga dapat mengoptimalkan beragam pengalaman pemain yang lebih luas.

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

Menggunakan fitur pengujian dan proses debug

Anda bisa melakukan pengujian menggunakan berbagai fitur yang didukung platform: