Ne hakkında bileşen tabanlı motor ?
Engine
Bir listesini tutacak GameScreens
, kendilerinin bir listesini tutacak bir ana sınıfınız olurdu Components
.
Motor bir sahiptir Update
ve bir Draw
yöntem ve her iki çağrıyı GameScreen
'ler Update
ve Draw
kendilerini her bileşen ve çağrı geçmesi yöntemleri Update
ve Draw
.
Bu şekilde sunulan, kötü ve tekrarlayan bir tasarım gibi geldiğini kabul ediyorum. Ama inan bana, kodum tüm eski yönetici sınıflarımdan daha bileşen tabanlı bir yaklaşım kullanarak daha temiz hale geldi .
Sadece büyük bir sınıf hiyerarşisinden geçtiğiniz BackgroundManager
ve belirli tüm farklı arka planları aramak zorunda olmadığınız için bu kodu korumak çok daha basittir . Sadece bir var ScrollingBackground
, ParallaxBackground
, StaticBackground
vb bir türet hangi tüm Background
sınıfa.
Sonunda, sıkça kullanılan birçok bileşen ve yardımcı yöntemle (örneğin FrameRateDisplayer
, hata ayıklama yardımcı programı, Sprite
vektörler için bir doku ve uzatma yöntemlerine sahip temel bir hareketli grafik olarak bir sınıf) tüm projeleriniz üzerinde yeniden kullanabileceğiniz oldukça sağlam bir motor oluşturacaksınız. ve rastgele sayı oluşturma).
Artık BackgroundManager
bir Background
sınıfınız olmayacak, onun yerine kendi kendini yönetecek bir sınıfınız olacaktır.
Oyununuz başladığında yapmanız gereken tek şey şu:
// 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();
Ve oyun başlangıç kodunuz için bu kadar.
Ardından, ana menü ekranı için:
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);
}
}
}
Genel fikri anlıyorsunuz.
Ayrıca , bir sınıf içinde bile yeni ekranlar ekleyebilmek için, Engine
tüm GameScreen
sınıflarınızdaki referansları koruyabilirsiniz GameScreen
(örneğin, kullanıcı sizin içindeyken StartGame düğmesini tıkladığında, öğesineMainMenuScreen
geçiş yapabilirsiniz GameplayScreen
).
Aynı şey Component
sınıf için de geçerlidir : yeni bileşenler eklemek GameScreen
için hem Engine
sınıfa hem de üst öğeye erişime sahip olması için üst öğesinin referansını tutması gerekir GameScreen
(örneğin DrawableButton
, bir DrawableText
bileşeni ve bileşeni tutan
denilen HUD ile ilişkili bir sınıf yapabilirsiniz StaticBackground
).
Bundan sonra, Engine
sınıfınızda farklı yararlı hizmetleri tutabileceğiniz "hizmet tasarım deseni" (tam addan emin değilim) gibi diğer tasarım desenlerini de uygulayabilirsiniz (sadece bir IService
s listesini tutarsınız ve diğer sınıfların kendileri hizmet eklemesine izin verirsiniz) ). Örneğin Camera2D
, diğer bileşenleri çizerken dönüşümünü uygulamak için bir bileşeni hizmet olarak tüm projem üzerinde tutacağım . Bu, onu her yerde bir parametre olarak geçirmek zorunda kalmaz.
Sonuç olarak, bir motor için kesinlikle daha iyi tasarımlar olabilir, ancak bu bağlantı tarafından önerilen motoru çok zarif, son derece kolay bakım ve tekrar kullanılabilir buldum . Şahsen en azından denemenizi tavsiye ederim.