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: