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 Update
dan Draw
metode dan kedua panggilan GameScreen
's Update
dan Draw
metode, yang sendiri pergi melalui setiap komponen dan panggilan Update
dan 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 BackgroundManager
semua latar belakang yang berbeda. Anda hanya memiliki ScrollingBackground
, ParallaxBackground
, StaticBackground
, dll, yang semua berasal dari Background
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, tetapi Background
kelas 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 Engine
dalam semua GameScreen
kelas Anda , untuk dapat menambahkan layar baru bahkan di dalam GameScreen
kelas (misalnya ketika pengguna mengklik tombol StartGame saat berada di dalam Anda MainMenuScreen
, Anda dapat beralih ke GameplayScreen
).
Hal yang sama berlaku untuk Component
kelas: harus memegang referensi dari induknya GameScreen
, untuk memiliki akses ke Engine
kelas dan induknya GameScreen
untuk menambahkan komponen baru (misalnya Anda dapat membuat kelas terkait HUD DrawableButton
yang disebut memegang
DrawableText
komponen dan StaticBackground
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 daftar IService
dan membiarkan kelas lain menambahkan layanan sendiri ). misalnya saya akan menyimpan Camera2D
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.