8.2.2 创建游戏窗体
将Form1重命名为MainForm,并对其属性进行更新,将Text属性设置为GemDrops,将BackColor属性设置为Black。
还要在窗体的顶端添加两个标签,分别命名为lblScore和lblNextPiece。它们各自的Text属性分别为“Score:0”及“Next piece:”。lblScore标签停靠在窗体的顶部,所以它有足够的空间来显示玩家得分。lblNextPiece标签被固定在右上角,这样当屏幕的尺寸发生改变时(例如手机的方向发生改变),它还会保持在屏幕的右上角。将lblNextPiece标签的TextAlign属性设置为TopRight。
对MainMenu控件进行更新,添加一个Pause项和一个弹出菜单Menu项。弹出菜单中包含两个菜单项NewGame和ExitGame,用于开始游戏和退出游戏。最初的窗体设计。
在窗体的代码中,声明一个CGemDropsGame对象作为类级别的变量,名为_game。在窗体的构造函数中来对它进行实例化和初始化,如程序清单8-1所示。
程序清单8-1 对GemDrops游戏对象进行实例化和初始化
// Our instance of the GemDrops game
CGemDropsGame _game;
/// <summary>
/// Form constructor
/// </summary>
public MainForm()
{
InitializeComponent();
// Instantiate our game and set its game form to be this form
_game = new CGemDropsGame(this);
_game.Reset();
}
在该窗体中再添加一个名为SetScore的函数。它只是简单地以一个int变量作为参数,并将该值赋给lblScore标签的Text属性。该函数用于显示玩家每次得分后的分值
程序清单8-2 显示玩家得分的函数
/// <summary>
/// Display the score on the screen
/// </summary>
/// <param name="score">The player's new score</param>
internal void SetScore(int score)
{
lblScore.Text = "Score: " + score.ToString();
}
我们接下来完成窗体的OnPaintBackground函数和它的Load、Paint以及Closing事件处理程序。这些函数与前面章节中相应的函数几乎是相同的。此外还要添加RenderLoop函数,也与前面的示例相同。
将这些代码编译后,只能得到一个空的黑屏。接下来我们就开始开发游戏引擎。