Ne hakkında bileşen tabanlı motor ?
EngineBir listesini tutacak GameScreens, kendilerinin bir listesini tutacak bir ana sınıfınız olurdu Components.
Motor bir sahiptir Updateve bir Drawyöntem ve her iki çağrıyı GameScreen'ler Updateve Drawkendilerini her bileşen ve çağrı geçmesi yöntemleri Updateve 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 BackgroundManagerve belirli tüm farklı arka planları aramak zorunda olmadığınız için bu kodu korumak çok daha basittir . Sadece bir var ScrollingBackground, ParallaxBackground, StaticBackgroundvb bir türet hangi tüm Backgroundsı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ı, Spritevektö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 BackgroundManagerbir Backgroundsı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, Enginetüm GameScreensı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 Componentsınıf için de geçerlidir : yeni bileşenler eklemek GameScreeniçin hem Enginesınıfa hem de üst öğeye erişime sahip olması için üst öğesinin referansını tutması gerekir GameScreen(örneğin DrawableButton, bir DrawableTextbileşeni ve bileşeni tutan
denilen HUD ile ilişkili bir sınıf yapabilirsiniz StaticBackground).
Bundan sonra, Enginesı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 IServices 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.