8.2.3 為游戲做準(zhǔn)備
為了適用于QVGA和VGA屏幕:我們將使用兩套不同的圖形集。GemDrops游戲中所需要的只是幾種顏色不同的寶石。前面已經(jīng)討論過,小寶石圖形的高度是16像素,為了得到一個(gè)舒適的對(duì)象尺寸,將其寬度設(shè)置為21像素。大寶石圖形的高度為32像素,寬度為42像素。
寶石圖形包含了兩個(gè)PNG圖像文件:小寶石圖形文件名為Gems16.png,大寶石圖形文件名為Gems32.png。每個(gè)圖像中包含了一行6種不同顏色的寶石。寶石剛好為16×21像素和32×42像素。因此,當(dāng)我們需要選擇顯示某種顏色的寶石時(shí),只需要將該顏色的索引和寶石的寬度相乘得到該寶石圖形所在的矩形左邊的偏移量,就可以得到相應(yīng)的矩形的位置,從而可以選擇該顏色的寶石。
在CGemDropsGame.Prepare函數(shù)中要為游戲做的第一件事是判斷要使用哪個(gè)圖形集。我們采用前面已經(jīng)提到過的方法,檢測(cè)屏幕的高度。如果小于480像素,就使用小圖形,否則使用大圖形。無論選擇哪個(gè)圖形,該圖形都會(huì)被加載到游戲引擎的GameGraphics字典中,參考在第4章中介紹過的方式。除了加載圖形文件外,還要對(duì)類中的兩個(gè)字段進(jìn)行設(shè)置:_gemWidth和_gemHeight,它們包含了每個(gè)單獨(dú)的寶石圖形的寬度和高度。
一旦得到了每個(gè)寶石的尺寸,我們還可以計(jì)算出屏幕上游戲區(qū)域左上角的坐標(biāo)。我們希望游戲區(qū)域位于窗口的中央。因此,將窗體的寬度減去游戲區(qū)域的寬度,然后除以2,就可以得到游戲區(qū)域左邊側(cè)的位置。而游戲區(qū)域的寬度則可以通過每個(gè)寶石圖形的寬度(存儲(chǔ)在 gemWidth中)乘以區(qū)域中所包含的寶石列數(shù)(7)來得到。對(duì)于窗體和游戲區(qū)域的高度及其頂部的位置也可以采用相似的方式根據(jù)寶石圖形的高度來計(jì)算得到。
程序清單8-3 根據(jù)屏幕大小來為游戲做準(zhǔn)備
/// <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;
}