Bagaimana dengan mesin berbasis komponen ?
Anda akan memiliki kelas utama bernama Engine, yang akan menyimpan daftar GameScreens, yang akan memiliki daftar Components.
Mesin ini memiliki Updatedan Drawmetode dan kedua panggilan GameScreen's Updatedan Drawmetode, yang sendiri pergi melalui setiap komponen dan panggilan Updatedan Draw.
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 BackgroundManagersemua latar belakang yang berbeda. Anda hanya memiliki ScrollingBackground, ParallaxBackground, StaticBackground, dll, yang semua berasal dari Backgroundkelas.
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 FrameRateDisplayersebagai utilitas debugging, Spritekelas sebagai sprite dasar dengan tekstur dan metode ekstensi untuk vektor dan generasi nomor acak).
Anda tidak akan lagi memiliki BackgroundManagerkelas, tetapi Backgroundkelas yang akan mengelola sendiri.
Saat gim Anda mulai, yang harus Anda lakukan hanyalah ini pada dasarnya:
// when declaring variables:
Engine engine;
// when initializing:
engine = new Engine();
engine.Initialize();
engine.LoadContent();
engine.AddGameScreen(new MainMenuScreen());
// when updating:
engine.Update();
// when drawing:
engine.Draw();
Dan itu saja untuk kode permulaan gim Anda.
Kemudian, untuk layar menu utama:
class MainMenuScreen : MenuScreen // where MenuScreen derives from the GameScreen class
{
const int ENEMY_COUNT = 10;
StaticBackground background;
Player player;
List<Enemy> enemies;
public override void Initialize()
{
background = new StaticBackground();
player = new Player();
enemies = new List<Enemy>();
base.AddComponent(background); // defined within the GameScreen class
base.AddComponent(player);
for (int i = 0; i < ENEMY_COUNT; ++i)
{
Enemy newEnemy = new Enemy();
enemies.Add(newEnemy);
base.AddComponent(newEnemy);
}
}
}
Anda mendapatkan ide umum.
Anda juga akan menyimpan referensi di Enginedalam semua GameScreenkelas Anda , untuk dapat menambahkan layar baru bahkan di dalam GameScreenkelas (misalnya ketika pengguna mengklik tombol StartGame saat berada di dalam Anda MainMenuScreen, Anda dapat beralih ke GameplayScreen).
Hal yang sama berlaku untuk Componentkelas: harus memegang referensi dari induknya GameScreen, untuk memiliki akses ke Enginekelas dan induknya GameScreenuntuk menambahkan komponen baru (misalnya Anda dapat membuat kelas terkait HUD DrawableButtonyang disebut memegang
DrawableTextkomponen dan StaticBackgroundkomponen).
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 Enginekelas Anda (Anda cukup menyimpan daftar IServicedan membiarkan kelas lain menambahkan layanan sendiri ). misalnya saya akan menyimpan Camera2Dkomponen 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.