开发游戏引擎(5)

 

3. 启动时的初始化

当游戏首次运行时,可能需要做一系列工作:加载图形、准备一个成绩排行榜表格、或者设置游戏控制按钮。

我们将这些工作分为两类:只在游戏首次加载时发生一次的工作,和潜在的每次游戏开始后要重复做的工作。

像准备成绩排行榜表格这样的功能需要在类的构造函数中完成,不需要重写任何游戏引擎函数。

那些可能需要再实现的功能可以放置到重写的Prepare函数中(参见程序清单4-4)。在引擎进程的特定阶段会再次调用该函数;例如,当窗体大小发生改变时,会再次调用Prepare方法。因此,这就是说在该方法中要根据窗体的尺寸加载不同的图形,并且要根据窗体尺寸设置一个游戏坐标系。在第9章使用该引擎构建一个游戏时我们会详细介绍。

如果您想支持多套不同的图形集,那么在每次修改了选定的图形后,也可以从游戏代码中调用Prepare函数来重新初始化这些图形。

基类本身并不执行任何准备工作,所以可以只提供一个空的虚函数,让继承类可以对其重写。

程序清单4-4  Prepare 函数

/// <summary>

/// Virtual function to allow the game to prepare itself for rendering.

/// This includes loading graphics, setting coordinate systems, etc.

/// </summary>

public virtual void Prepare()

{

// Nothing to do for the base class.

}

4. 重置游戏

该函数用于准备引擎状态,使一个新游戏可以开始运行。该函数中要完成的任务包括将玩家得分重置为0并且进行清除,或者随机设置一个游戏难度。上一次游戏中产生的任何信息都要被清空,这样才不会对启动中的新游戏产生影响。

要对类的构造函数进行修改来使类在实例化时能够调用Reset函数。

与Prepare函数一样,我们也可以在基类中提供一个名为Reset的空的虚函数,这样所有从该类继承的引擎类都能够对其进行重写来执行这些任务。

5. 渲染

一旦游戏完成对自身的更新,就需要将游戏中所有需要的元素呈现到屏幕上。我们将调用一个名为Render的函数来执行该工作。正如您将会看到的,与渲染类型相关的继承类会重写该函数,然后执行继承引擎本身所需要的所有工作,同时让使用此引擎的游戏尽可能的简单。

与游戏重置一样,在基类中实际不需要做任何工作,所以我们只用简单地提供一个空的虚函数即可。

6. 更新游戏状态

所有与游戏相关的游戏功能将作为一个整体(如检测游戏是否已经结束)在Update函数中执行。我们的游戏会重写该函数来执行需要的任务,但是同样,在基类中什么也不做,所以保留该函数为空。

读书导航