Saya membuat crawler bawah tanah kecil di ruang angkasa, dan saya ingin mendengar beberapa saran tentang cara membuat backend dari mesin lebih bagus. Pada dasarnya, saat ini semuanya didasarkan pada omong kosong manajer:
- BackgroundManager: memiliki
AddBackground(image, parallax)
metode untuk membuat efek latar belakang keren. - ConfigManager: membaca / membuat file konfigurasi dan juga menyimpan data yang dibaca dari file konfigurasi tersebut.
- DrawManager: memiliki
Draw(sprite)
metode untuk menggambar barang ke layar, dan hal-hal sepertiSetView(view)
,GetView()
dll. - EntityManager: memegang semua entitas yang aktif dan memiliki metode untuk menambah, menghapus, dan menemukan entitas.
- DungeonManager (sebenarnya disebut GridManager, tapi ini untuk kesederhanaan): memiliki metode seperti
GenerateDungeon()
,PlaceEnemies()
,PlaceFinish()
dll
Sekarang saya bahkan tidak setengah jalan mendaftar semua manajer saya, jadi saya pikir ini harus berubah. Permainan saya juga didasarkan pada Layar, yang membuatnya lebih menyebalkan karena saya tidak perlu setengah dari hal-hal yang dikelola manajer saya, misalnya, menu utama (saya tidak perlu fisika / entitas / ruang bawah tanah di menu utama saya !)
Sekarang saya berpikir untuk membuat manajer tidak statis, dan memberikan ScreenMainGame saya contoh dari semua manajer khusus game. Tapi itu membuat memanggil / membuat segala sesuatu yang berhubungan dengan manajer berantakan besar ... misalnya, jika saya ingin menggambar ruang bawah tanah saya dari tempat yang tidak ada ScreenMainGame.Draw()
, saya harus melakukan ini ...
((ScreenMainGame)ScreenManager.CurrentScreen).GridManager.Draw()
Itu sangat jelek.
Jadi, sesama pengembang game, apakah ada di antara Anda yang punya ide bagaimana mengatasi kekacauan ini? Saya akan dihargai!
sumber
Jawaban:
Bagaimana dengan mesin berbasis komponen ?
Anda akan memiliki kelas utama bernama
Engine
, yang akan menyimpan daftarGameScreens
, yang akan memiliki daftarComponents
.Mesin ini memiliki
Update
danDraw
metode dan kedua panggilanGameScreen
'sUpdate
danDraw
metode, yang sendiri pergi melalui setiap komponen dan panggilanUpdate
danDraw
.Disajikan seperti itu, saya setuju bahwa itu terdengar seperti desain yang buruk dan berulang-ulang. Tapi percayalah, kode saya menjadi lebih bersih dengan menggunakan pendekatan berbasis komponen daripada dengan semua kelas manajer lama saya .
Jauh lebih mudah untuk mempertahankan kode seperti itu juga, karena Anda hanya akan melalui hierarki kelas besar dan tidak harus mencari
BackgroundManager
semua latar belakang yang berbeda. Anda hanya memilikiScrollingBackground
,ParallaxBackground
,StaticBackground
, dll, yang semua berasal dariBackground
kelas.Anda akhirnya akan membangun mesin yang cukup solid yang dapat Anda gunakan kembali atas semua proyek Anda dengan banyak komponen yang sering digunakan dan metode penolong (misalnya
FrameRateDisplayer
sebagai utilitas debugging,Sprite
kelas sebagai sprite dasar dengan tekstur dan metode ekstensi untuk vektor dan generasi nomor acak).Anda tidak akan lagi memiliki
BackgroundManager
kelas, tetapiBackground
kelas yang akan mengelola sendiri.Saat gim Anda mulai, yang harus Anda lakukan hanyalah ini pada dasarnya:
Dan itu saja untuk kode permulaan gim Anda.
Kemudian, untuk layar menu utama:
Anda mendapatkan ide umum.
Anda juga akan menyimpan referensi di
Engine
dalam semuaGameScreen
kelas Anda , untuk dapat menambahkan layar baru bahkan di dalamGameScreen
kelas (misalnya ketika pengguna mengklik tombol StartGame saat berada di dalam AndaMainMenuScreen
, Anda dapat beralih keGameplayScreen
).Hal yang sama berlaku untuk
Component
kelas: harus memegang referensi dari induknyaGameScreen
, untuk memiliki akses keEngine
kelas dan induknyaGameScreen
untuk menambahkan komponen baru (misalnya Anda dapat membuat kelas terkait HUDDrawableButton
yang disebut memegangDrawableText
komponen danStaticBackground
komponen).Anda bahkan dapat menerapkan pola desain lain setelah itu, seperti "pola desain layanan" (tidak yakin tentang nama persisnya) tempat Anda dapat menyimpan berbagai layanan bermanfaat di dalam
Engine
kelas Anda (Anda cukup menyimpan daftarIService
dan membiarkan kelas lain menambahkan layanan sendiri ). misalnya saya akan menyimpanCamera2D
komponen di atas semua proyek saya sebagai layanan untuk menerapkan transformasi ketika menggambar komponen lain. Ini menghindari harus meneruskannya sebagai parameter di mana pun.Kesimpulannya, mungkin ada desain lain yang lebih baik untuk sebuah mesin, tetapi saya menemukan mesin yang diusulkan oleh tautan ini sangat elegan, sangat mudah dirawat, dan dapat digunakan kembali. Saya pribadi akan merekomendasikan setidaknya mencobanya.
sumber
GameComponent
dan layanan. Tidak perluEngine
kelas yang terpisah .Yang ingin Anda lakukan adalah memisahkan kode Anda menjadi komponen dan layanan. XNA sudah memiliki dukungan bawaan untuk ini.
Lihat artikel ini pada
GameComponents
dan jasa. Kemudian lihat jawaban ini tentang menggunakan layanan di XNA, dan ini jawaban yang lebih umum tentang layanan dalam bahasa apa pun.sumber
Hanya karena mereka statis atau global tidak berarti mereka harus selalu dimuat / diinisialisasi. Gunakan pola Singleton dan biarkan manajer dibebaskan dan dimuat kembali sesuai permintaan.
sumber