怎么样一个基于组件的引擎?
您将有一个名为的主类Engine
,该主类将保留一个列表GameScreens
,而它们本身将包含一个列表Components
。
该发动机具有Update
和Draw
方法都调用GameScreen
的Update
和Draw
方法,其本身经历的每个组件和呼叫Update
和Draw
。
如此呈现,我同意这听起来像是一个糟糕而重复的设计。但是请相信我,与所有旧的管理器类相比,通过使用基于组件的方法,我的代码变得更加整洁。
维护这样的代码也要简单得多,因为您只需要遍历一个大的类层次结构,而不必搜索BackgroundManager
所有特定的不同背景。你只需要一个ScrollingBackground
,ParallaxBackground
,StaticBackground
等所有从一个派生Background
类。
最终,您将构建一个非常可靠的引擎,可以使用很多常用的组件和辅助方法(例如,FrameRateDisplayer
作为调试实用程序,Sprite
作为基本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
添加新的组件(例如,你可以创建一个名为HUD相关类DrawableButton
持有一个
DrawableText
组件和StaticBackground
组件)。
之后,您甚至可以应用其他设计模式,例如“服务设计模式”(不确定确切的名称),您可以在Engine
类中保留不同的有用服务(您只需保留IService
s 的列表,并让其他类自己添加服务) )。例如,我会Camera2D
在整个项目中保留一个组件作为服务,以便在绘制其他组件时应用其转换。这样避免了将其作为参数传递到任何地方。
总之,肯定会有其他更好的引擎设计,但是我发现通过此链接提出的引擎非常优雅,极易维护和可重复使用。我个人建议至少尝试一下。