构造函数将提供的gameForm对象的引用存储在类级别私有变量_gameForm中。为了彻底对这些对象进行控制,我们将所有类级别变量的访问类型定义为private,然后提供相应的属性供类以外的代码进行访问。因此,我们还需要添加一个属性,这样该基类以外的代码也可以获取对该窗体的引用。
我们将为该窗体对象提供一个公共的只读属性。由于是属性被设置为公共的,因此本引擎程序集中以及其他外部游戏程序集中任何从这里继承的类都可以访问该窗体对象,如程序清单4-2所示。
程序清单4-2 最初的CGameEngineBase 类
/// <summary>
/// Return our game form object
/// </summary>
public Form GameForm
{
get
{
// Return our game form instance
return _gameForm;
}
}
现在我们已经解决了“如何创建引擎”的问题,接下来看看需要为该类提供的功能。首先,要为该类添加两部分主要功能:对象管理及游戏功能。我们先来看对象管理部分。
1. 管理游戏对象
游戏中的每个对象都代表了屏幕上一个单独的图形实体。每个对象在屏幕上有一个位置,并且知道如何对自己进行绘制,也知道如何进行移动。
我们将在游戏引擎中保存一个集合,将任意时刻游戏中所有活动的对象包含到该集合中。这样当需要某个对象做一些事情时,引擎就能够与它进行交互。
在游戏中可以向游戏环境中添加新的对象,只需要创建这一个对象,并且把它添加到对象集合中。这种方式可以简单灵活地处理潜在的大量的对象:每次想在游戏中添加点东西时,我们只要将它添加到对象集合中,然后就可以不用管它了,在游戏引擎之外不需要任何额外的代码来管理这些对象。
所有游戏对象是在CGameObjectBase的继承类中实现的,我们马上就会对该类进行详细介绍。为了保存这些对象的集合,需要在CGameEngineBase类中添加一个类变量及其相应的访问属性。如程序清单4-3所示。
程序清单4-3 游戏引擎中的对象集合及其访问属性
/// <summary>
/// Store a collection of game objects that are currently active
/// </summary>
private System.Collections.Generic.List<CGameObjectBase> _gameObjects;
/// <summary>
/// Retrieves the list of active game objects
/// </summary>
public System.Collections.Generic.List<CGameObjectBase> GameObjects
{
get
{
return _gameObjects;
}
}
然后要对类的构造函数进行修改,当类进行实例化时要创建一个_gameObjects集合的实例。
要管理该对象列表中的对象,需要添加一些额外的代码,在下一节的Advance函数中将对其进行介绍。
2. 游戏中的方法
为了使游戏能够运行,需要让它做下列事情:
● 执行启动初始化。
● 为开始一个新游戏进行重置。
● 玩游戏时对游戏的状态进行更新。
● 在屏幕上进行绘制。
接下来看看每个工作是如何实现和使用的。