Bagaimana saya harus mengembangkan game Android saya secara efisien? [Tutup]


11

Saya telah melampirkan gambar diagram alir yang saya buat dalam cat. Diagram alir konsep permainan

Gambar menunjukkan bagaimana saya ingin mengembangkan game saya. Saya ingin game yang berjalan hebat dengan pengkodean cerdas yang mudah diperbarui dan fitur iklan seiring waktu. Platform target saya adalah smartphone Android dan semua kode akan ditulis dalam java dengan sumber daya yang meningkat XML, jika itu penting. Saya tidak mencari kode keras, meskipun kode semu akan membantu, saya lebih suka saran dan saran dari pro.

Pertanyaan saya adalah:

Apakah ini cara yang baik untuk memprogram permainan atau adakah cara yang lebih baik untuk melakukan ini? Apakah ada modifikasi yang perlu dilakukan? Setiap saran akan berguna karena saya tidak berpengalaman dalam pemrograman game jadi saya lebih suka saran dari seseorang yang telah menulis beberapa game dan tahu dari pengalaman bagaimana seseorang harus mengatur kode mereka agar berjalan dengan efisien.

Jawaban:


12

Banyak game android bahkan tidak cukup besar dalam cakupan untuk membenarkan save / load atau opsi / preferensi, apalagi karakter khusus dan sejenisnya hanya karena mereka dimainkan begitu saja selama 10 menit di rumah kereta.

Jangan membuat kesalahan yang saya lakukan memulai sesuatu dengan cakupan besar untuk game android pertama. Buatlah banyak gim yang lebih kecil lalu pilih yang lebih besar

Khusus untuk Android:

Struktur:

Saya akan merekomendasikan memiliki hampir semua game dalam satu kelas aktivitas. Android bekerja dengan gagasan bahwa setiap kegiatan seperti aplikasi mini, semi-independen dari aktivitas lain di aplikasi. Aplikasi ini pada dasarnya adalah setumpuk kegiatan, dengan pengguna melihat mana yang ada di atas.

Ketika Anda menghapus satu dari atas, umumnya akan hancur dan akan dibuat kembali saat pengguna memulai aktivitas baru (startActivity intent). Ini membuatnya sulit untuk mempertahankan keadaan di antara aktivitas dan mengarah ke arsitektur aktivitas tunggal

Anda mungkin ingin memiliki aktivitas jenis layar Utama dengan menu "Game Baru / Muat Game / Opsi" di dalamnya, dan menjadikannya aktivitas peluncuran. Namun, Anda akhirnya harus memiliki menu dalam gim juga dalam aktivitas gim Anda, yang akan memiliki sebagian besar fungsi yang sama di dalamnya.

Aplikasi saya sendiri, saya membuat "MenuActivity" yang memiliki fungsi yang meluncurkan game baru, menyimpan, memuat, mengubah opsi. Kemudian HomeActivity saya memperluas itu, seperti halnya GameActivity saya.

Karena semuanya berada dalam satu kelas Activity, saya akan merekomendasikan membuat hierarki kelas aktivitas dan menggunakan lot lingkup privat, terlindungi, dan default. Melakukannya dengan cara ini, Anda setidaknya dapat membagi berbagai hal menjadi file yang berbeda untuk berhenti memiliki satu file Aktivitas yang tidak dapat dikelola. Misalnya untuk aplikasi saya sendiri:

GraphicsEngine extends MenuActivity.

PhysicsEngine extends GraphicsEngine.

GameLogicActivity extends PhysicsEngine.

UIActivity extends GameLogicActivity.

Karena aplikasi saya adalah pembuka 3D, banyak hal yang saya lakukan tidak berfungsi lintas aktivitas sehingga semuanya dalam aktivitas yang sama, jadi mungkin saya bias menggunakan satu arsitektur aktivitas

-

Threading

Untuk aktivitas gim, Anda memiliki dua utas (atau 3 jika Anda melakukan hal-hal pembuka 3D). Satu utas adalah utas / utas utama. Ini adalah utas kegiatan memulai dan menjalankan dan diberikan kepada Anda oleh android.

Utas UI ini adalah satu-satunya yang dapat Anda perbarui elemen UI (tampilan, tata letak, dll.). Ini juga merupakan tempat di mana pendengar untuk input pengguna akan berjalan. Anda tidak melihat mekanisme apa pun dari utas UI, hanya saja ia bekerja dalam loop di latar belakang di suatu tempat.

Utas kedua, Anda buat sendiri (saya akan merekomendasikan menggunakan AsyncTask , terlepas dari semua kekurangannya). Ini melakukan semua hal non-UI yang Anda lakukan dalam lingkaran permainan normal, seperti memperbarui gerakan, menghitung tabrakan, perhitungan pertempuran, dan sebagainya.

Anda menjadikan thread / kelas AsyncTask ini sebagai kelas inti dari aktivitas Anda. Dengan begitu, Anda dapat memiliki beberapa objek lingkup aktivitas ( Vector<Spaceship>) yang dapat diakses oleh utas UI dan utas loop game.

Karena logika permainan sedang berlangsung di utas loop permainan, itulah satu-satunya utas yang perlu benar-benar mengubah nilai-nilai variabel (perbarui kecepatan tangki, kurangi pemain HP). Utas UI hanya membaca nilai, jadi harus ada masalah konkurensi minimal.

Agak sulit adalah mendapatkan utas UI untuk melakukan pembaruan atas permintaan utas loop game. Ada banyak cara melakukan ini. Jika Anda membaca dokumentasi AsyncTask, ia memiliki metode publishProgress () / onProgressUpdate (). Ini sebenarnya menambahkan hal-hal ke antrian thread UI hal yang harus dilakukan loop berikutnya.

Handler melakukan hal yang persis sama, di mana Anda menerapkan metode handleMessage () dan metode itu sebenarnya dieksekusi oleh utas loop berikutnya.

Akhirnya, input pengguna apa pun, yang berada di utas UI, Anda dapat memperbarui elemen UI langsung darinya (jadi di dalam implementasi pendengar onClick / onTouch). Jika Anda perlu memperbarui objek game, Anda dapat menggunakan hal-hal seperti menyinkronkan, atau Anda dapat mengimplementasikan antrian pembaruan Anda sendiri ke AsyncTask yang menyukai utas UI, akan dijalankan saat berikutnya ia mengeksekusi loop game

Panduan Threading Android .

-

UI

Adapun struktur UI aktual dalam aktivitas tunggal, saya sarankan memiliki tata letak bingkai sebagai tata letak dasar Anda. Elemen anak dalam tata letak bingkai bekerja seperti antrian. Elemen pertama digambar terlebih dahulu, kedua digambar di atas yang pertama, ketiga di atas yang kedua.

Dengan cara ini, Anda dapat memiliki beberapa file tata letak XML dan dengan mengelola anak-anak tata letak bingkai, dapat dengan mudah bertukar set tampilan masuk dan keluar.

Jika Anda selalu memiliki SurfaceView di bagian bawah (anak pertama dalam tata letak bingkai), maka Anda dapat menggunakan semua tampilan / widget android yang biasa (tombol, tampilan teks, tampilan gulir) dll di atas tampilan permukaan, yang hanya melakukan bagian grafis dari permainan.

Jadi misalnya, jika ada sesuatu yang dimuat, Anda dapat menjeda loop game / hanya membuatnya melompati semuanya, tambahkan layar 'memuat' buram sebagai anak terakhir ke tata letak bingkai dan pengguna akan melihat 'memuat' muncul di layar mereka. , cukup tidak menyadari bahwa pandangan lain ada di belakangnya. Dengan cara ini Anda tidak perlu menghapus tampilan yang membutuhkan waktu lama untuk mengatur atau menyebabkan komplikasi setiap kali mereka ditambahkan / dihapus.

Saya juga merekomendasikan menggunakan banyak View.setVisibility. Anda bisa misalnya, menambahkan tata letak 'inventaris' keseluruhan ke tata letak bingkai dasar Anda dan kemudian hanya mengatur Visibilitas (View.Visible) di atasnya ketika pengguna mengklik untuk melihat inventaris mereka, dan mengatur Visibilitas (View.Gone) ketika mereka menutupnya lagi. Dengan begitu, Anda bahkan tidak mengelola anak-anak dari tata letak bingkai sebanyak hanya menambahkan semua dan membuat sesuatu terlihat / tidak terlihat seperti dan ketika pengguna melakukan hal-hal yang berbeda

Ini membantu dengan threading lagi; ketika pengguna mengklik untuk membuka inventaris mereka, onCLickListener ditangani di utas UI, inventaris dibuat terlihat di dalamnya, dan metode updateInventory dipanggil, sekali lagi dari utas UI, dengan hanya getter pada semua objek game yang dipanggil

Berikut diagram yang saya buat untuk pertanyaan sebelumnya tentang satu ide aktivitas / tata letak bingkai:

masukkan deskripsi gambar di sini


jadi menurut Anda saya harus memiliki tata letak bingkai untuk menampung semua komponen loop game, kan? Jika saya melakukan itu, bagaimana saya mendapatkan pandangan di kelas HUD untuk memiliki interaktivitas dengan SurfaceView, misalnya katakanlah virtual d-pad / virtual analog? Saya telah mencoba melakukan hal-hal seperti itu sebelumnya dan mengalami kesalahan.
kdavis8

Saya akan menulis ulang jawaban saya untuk membuatnya sedikit lebih jelas
Spoon Thumb

Tulis ulang jawaban saya. Harapan yang membuatnya lebih jelas
Spoon Thumb

Terima kasih banyak untuk gangguan yang benar-benar merinci, benar-benar tidak ada banyak tutorial bagus untuk pengembangan game android
kdavis8

11

Banyak yang saya lihat dalam diagram Anda terkait UI, dan itu tampaknya cukup masuk akal. Hanya ada sebagian kecil dari diagram Anda yang disediakan untuk logika game aktual, dan itu sangat kabur.

Saya pikir Anda berusaha terlalu keras. Saya sarankan Anda mulai menulis kode. Pilih masalah tertentu dan mulailah menyelesaikannya. Anda akan belajar banyak sehingga pada saat Anda memiliki gagasan yang lebih baik tentang ruang masalah Anda, Anda akan memiliki perspektif yang sama sekali berbeda (dan lebih berguna).


2
Saya sangat setuju dengan ini. Pilih arsitektur desain yang sesuai dengan gim dan preferensi Anda, lalu mulai koding. Ketika Anda menekan hambatan kinerja tertentu, optimalkan sampai berfungsi. Setiap mekanisme individual dalam gim Anda akan memiliki karakteristik kinerja sendiri dan potensi optimisasi - Anda harus memikirkannya secara individual, bukan secara keseluruhan.
Polinomial

di mana orang bisa menemukan panduan untuk pola seperti itu untuk arsitektur game? itu akan sangat membantu saya.
bot_bot
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.