游戏案例:GemDrops(11)

 

8.2.6  暂停游戏

稍后我们将介绍如何使用_gameOver变量,现在先简单地将对_paused变量的处理进行包装。通过一个标准的名为Paused的公共属性过程,使在类外可以访问该变量。为了使它实际有效,我们对Advance函数进行重写,如程序清单8-13所示。

程序清单8-13  实现暂停功能

/// <summary>

/// Advance the simulation by one frame

/// </summary>

public override void Advance()

{

// If we are paused then do nothing...

if (_paused) return;

// Otherwise get the base class to process as normal

base.Advance();

}

您可能会记得,游戏引擎中的Advance函数是用于推进整个引擎向前运行的,在基类代码中,游戏本身以及所有的游戏对象都会调用Update函数,使所有事物保持移动。

当将_paused变量设置为true时,就阻止了对基类的调用,从而使游戏暂停。这样会使得游戏本身及游戏对象不发生任何更新,不再进行任何进一步的移动——正是暂停游戏所需要的。只要将_paused标志设置为false,就会重新调用base.Advance函数,游戏就会恢复运行。

8.2.7  显示用于玩家控制的宝石

游戏区域现在是空的,所以接下来要允许玩家在其中做一些操作。当游戏开始时就随机生成一对宝石,将它们放在游戏区域顶部的中间。然后宝石会逐渐向游戏区域的底部下落。

1. 对CObjGem类进行完善

为了保证游戏知道如何处理宝石的移动,我们首先要为CObjGem类添加一些新的函数。宝石有3种状态:在玩家控制中、落在游戏区域的底部以及显示在Next piece中(为玩家显示接下来的宝石的颜色)。

我们需要以不同的方式对各种类型的宝石进行处理。玩家控制中的宝石是渐渐地向游戏区域的底部降落。落在游戏区域底部的宝石大部分时间都是静止的,但当下方产生了空缺时它们就会快速地落下。在Next piece中显示的宝石完全是静止的,不会发生任何移动。

这样,每个宝石实例就知道该做何操作,我们创建一个名为GemTypes的枚举,为每一种类型设置一个枚举值,并且定义一个类级别的变量来保存每个对象的类型(并提供了一个公共属性供外部访问)。该枚举及变量的定义如程序清单8-14所示。

程序清单8-14  _gemType变量及GemTypes枚举

// The type of gem represented within this object...

private GemTypes _gemType;

// Possible gem types are:

public enum GemTypes

{

OnTheBoard, // A gem that has been placed on to the game board

PlayerControlled, // A gem that is moving under player control

NextGem // A gem in the "next piece" display

};

这样宝石就可以平滑地下落,而不是每次都对整个游戏区域进行刷新,我们再进一步添加两个变量:_fallDistance及_fallSpeed。_fallDistance变量用来存储宝石在当前位置(保存在我们已经讨论过的_boardXPos变量与_boardYPos变量中)时与底部之间的距离。因此_fallDistance为0就意味着宝石已经到达目标位置;大于0就表示它尚未落地。

该变量中的距离以游戏单位而不是像素进行计量。这样符合我们的抽象坐标系。我们可以通过设置_fallDistance变量为0.5,从而可以在行的中间绘制宝石,不需要知道实际对应了屏幕上多少个像素。

当玩家控制的宝石在运动中时,就将其_boardYPos设置为它降落时所在的位置,将其_fallDistance值初始设置为1。当每次调用宝石的Update方法时,令_fallDistance值递减,就可以使宝石自动向下降落。

宝石降落速度越快,就越难对它进行控制。快速移动的宝石将使玩家没有太多的机会考虑将宝石落在哪个位置上,从而错误增多。这也是我们随着游戏的进行提高游戏难度的一种方式。

我们用_fallSpeed变量来设置宝石降落的速度。每次更新时需要从_fallDistance变量中减去该值,如程序清单8-15中所做的那样。只对玩家控制的宝石做这些操作,Next piece中的宝石不发生移动。在本章的后文中我们将会介绍游戏区域中的宝石该如何处理。

读书导航