何についてのコンポーネント・ベースのエンジン?
という名前のメインクラスがあり、EngineリストをGameScreens保持しますComponents。
エンジンはありUpdate及びDraw方法との両方のコールGameScreenさんUpdateとDraw自身がすべてのコンポーネントとコールを経る方法、UpdateおよびをDraw。
そのように提示されると、それは貧弱で反復的なデザインのように聞こえることに同意します。しかし、私を信じてください。私のコードは、コンポーネントベースのアプローチを使用することで、以前のすべてのマネージャークラスよりもずっときれいになりました。
このようなコードを維持する方がはるかに簡単です。なぜなら、大きなクラス階層を通過するだけでBackgroundManager、特定の異なる背景をすべて検索する必要がないからです。あなただけの持っているScrollingBackground、ParallaxBackground、StaticBackground、などから派生したすべてのBackgroundクラス。
最終的には、非常に堅牢なエンジンを構築し、頻繁に使用するコンポーネントとヘルパーメソッド(たとえばFrameRateDisplayer、デバッグユーティリティ、Spriteテクスチャ付きの基本スプライトとしてのクラス、ベクトルの拡張メソッドなど)を使用してすべてのプロジェクトで再利用できます乱数生成)。
BackgroundManagerクラスはもうありませんが、Background代わりに自分自身を管理するクラスがあります。
ゲームが開始されたら、基本的に次のことだけです:
// 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();
これでゲーム開始コードは終わりです。
次に、メインメニュー画面の場合:
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);
}
}
}
あなたは一般的なアイデアを得る。
また、クラス内でも新しい画面を追加できるように、EngineすべてのGameScreenクラス内の参照を保持しますGameScreen(たとえば、内でユーザーがStartGameボタンをクリックすると、にMainMenuScreen移行できますGameplayScreen)。
Componentクラスについても同じことが言えます。クラスの親の参照を保持しGameScreenて、Engineクラスとその親GameScreenへのアクセス権を持たせ、新しいコンポーネントを追加する必要があります(たとえばDrawableButton、DrawableTextコンポーネントとコンポーネントを保持する
HUD関連クラスを呼び出すことができStaticBackgroundます)。
その後、他のデザインパターンを適用することもできます。たとえば、「サービスデザインパターン」(正確な名前はわかりません)のように、Engineクラス内にさまざまな有用なサービスを保持IServiceできます)。たとえば、Camera2D他のコンポーネントを描画するときにその変換を適用するサービスとして、すべてのプロジェクトでコンポーネントを保持します。これにより、パラメータとしてどこにでも渡す必要がなくなります。
結論として、エンジンには他にも優れた設計があるかもしれませんが、このリンクで提案されているエンジンは非常にエレガントで、非常に簡単に保守および再利用できます。個人的には、少なくとも試してみることをお勧めします。