何についてのコンポーネント・ベースのエンジン?
という名前のメインクラスがあり、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
他のコンポーネントを描画するときにその変換を適用するサービスとして、すべてのプロジェクトでコンポーネントを保持します。これにより、パラメータとしてどこにでも渡す必要がなくなります。
結論として、エンジンには他にも優れた設計があるかもしれませんが、このリンクで提案されているエンジンは非常にエレガントで、非常に簡単に保守および再利用できます。個人的には、少なくとも試してみることをお勧めします。