8.2.3 为游戏做准备
为了适用于QVGA和VGA屏幕:我们将使用两套不同的图形集。GemDrops游戏中所需要的只是几种颜色不同的宝石。前面已经讨论过,小宝石图形的高度是16像素,为了得到一个舒适的对象尺寸,将其宽度设置为21像素。大宝石图形的高度为32像素,宽度为42像素。
宝石图形包含了两个PNG图像文件:小宝石图形文件名为Gems16.png,大宝石图形文件名为Gems32.png。每个图像中包含了一行6种不同颜色的宝石。宝石刚好为16×21像素和32×42像素。因此,当我们需要选择显示某种颜色的宝石时,只需要将该颜色的索引和宝石的宽度相乘得到该宝石图形所在的矩形左边的偏移量,就可以得到相应的矩形的位置,从而可以选择该颜色的宝石。
在CGemDropsGame.Prepare函数中要为游戏做的第一件事是判断要使用哪个图形集。我们采用前面已经提到过的方法,检测屏幕的高度。如果小于480像素,就使用小图形,否则使用大图形。无论选择哪个图形,该图形都会被加载到游戏引擎的GameGraphics字典中,参考在第4章中介绍过的方式。除了加载图形文件外,还要对类中的两个字段进行设置:_gemWidth和_gemHeight,它们包含了每个单独的宝石图形的宽度和高度。
一旦得到了每个宝石的尺寸,我们还可以计算出屏幕上游戏区域左上角的坐标。我们希望游戏区域位于窗口的中央。因此,将窗体的宽度减去游戏区域的宽度,然后除以2,就可以得到游戏区域左边侧的位置。而游戏区域的宽度则可以通过每个宝石图形的宽度(存储在 gemWidth中)乘以区域中所包含的宝石列数(7)来得到。对于窗体和游戏区域的高度及其顶部的位置也可以采用相似的方式根据宝石图形的高度来计算得到。
程序清单8-3 根据屏幕大小来为游戏做准备
/// <summary>
/// Prepare the game engine for use.
/// </summary>
public override void Prepare()
{
// Allow the base class to do its work.
base.Prepare();
// Get a reference to our assembly
Assembly asm = Assembly.GetExecutingAssembly();
// Initialise graphics library
// Which graphics set are we using?
if (Screen.PrimaryScreen.Bounds.Height < 480)
{
// The screen height is insufficient for the large graphics set,
// so load the small graphics
GameGraphics.Clear();
GameGraphics.Add("Gems",
New Bitmap(asm.GetManifestResourceStream
("GemDrops.Graphics.Gems16.png")));
_gemWidth = 21;
_gemHeight = 16;
}
else
{
// We have enough space to use the large graphics set
GameGraphics.Clear();
GameGraphics.Add("Gems",
new Bitmap(asm.GetManifestResourceStream
("GemDrops.Graphics.Gems32.png")));
_gemWidth = 42;
_gemHeight = 32;
}
// Position the board within the window
_boardLeft = (GameForm.ClientSize.Width - (GemWidth * BOARD_GEMS_ACROSS)) / 2;
_boardTop = (GameForm.ClientSize.Height - (GemHeight * BOARD_GEMS_DOWN)) / 2;
}