從該代碼的最后兩行可以看到,游戲區(qū)域的尺寸(7×15個寶石)包含在兩個常量BOARD_
GEMS_ACROSS及BOARD_GEMS_DOWN中(它們將在后面的程序清單8-8中進行定義)。如果想修改游戲區(qū)域的尺寸,通過修改這兩個常量可以很輕松地實現(xiàn)。
此代碼看似簡單,但它完成了一些非常重要的工作:它設置了一個抽象的坐標系。我們可以在屏幕上繪制寶石而不用考慮屏幕的分辨率,也不用考慮加載的是哪個圖形集。要得到繪制寶石的坐標,只需要將坐標(_boardLeft, _boardTop)在x軸上的位置值乘以_gemWidth值,在y軸上的位置值乘以_gemHeight值即可。這種方式為我們省去了程序中不少復雜的計算。
8.2.4 創(chuàng)建寶石游戲?qū)ο?/h3>
接下來,我們將注意力轉移到GemDrops游戲所包含的兩個游戲?qū)ο笾弧獙毷?。它在CObjGem類中實現(xiàn),每個實例都代表了游戲中的一個寶石。寶石可能是安放在游戲區(qū)域中,可能是在玩家的控制中,甚至是顯示在“Next piece”區(qū)域中,在后文中我們會討論如何在這些不同的情形中使用該對象。
CObjGem類繼承自GameEngine.CGameObjectGDIBase類。我們將向其中添加一些額外的屬性,使我們能夠按照自己的想法來配置寶石。目前我們感興趣的屬性如程序清單8-4所示。
程序清單8-4 CObjGem類的屬性
// Our reference to the game engine
private CGemDropsGame _game;
// The color of this gem
private int _gemColor = 0;
// The X position within the board (in game units, so from 0 to 6)
private int _boardXPos = 0;
// The Y position within the board (in game units, so from 0 to 14)
private int _boardYPos = 0;
這些屬性提供了我們需要的寶石的一些基本信息:它是什么顏色?它位于什么位置?在表示位置時使用的是游戲區(qū)域中的x坐標和y坐標,而不是像素坐標或類似的東西。
此外,還有一個對CGemDropsGame對象的強類型的引用,這樣不需要轉換成適當?shù)念愋途涂梢耘c它進行交互。
接下來是該類的構造函數(shù)。除了默認的構造函數(shù)之外,我們還想在創(chuàng)建該類的時候能指定寶石的位置和顏色,如程序清單8-5所示。注意,在這個重寫中調(diào)用了默認的構造函數(shù),而不是基類中的構造函數(shù),所以最終還是將游戲引擎的引用存儲到類級別的變量_game中。
程序清單8-5 CObjGem類的構造函數(shù)
/// <summary>
/// Constructor
/// </summary>
public CObjGem(CGemDropsGame gameEngine)
: base(gameEngine)
{
// Store a reference to the game engine as its derived type
_game = gameEngine;
}
/// <summary>
/// Constructor
/// </summary>
/// <param name="boardX">The x position for the gem</param>
/// <param name="boardY">The y position for the gem</param>
/// <param name="color">The color for the gem</param>
public CObjGem(CGemDropsGame gameEngine, int boardX, int boardY, int color)
: this(gameEngine)
{
_boardXPos = boardX;
_boardYPos = boardY;
_gemColor = color;
}
有一點需要注意的是,并非像在以前的例子中所做的那樣在構造函數(shù)中設置Width或Height屬性。稍后介紹這些屬性的重寫時就會看到這樣做的原因。
寶石本來需要能夠渲染自己。大多數(shù)情況下,寶石只需要設置一種顏色即可,我們將用圖8-7中相應的寶石圖形來渲染它。然而,彩虹寶石不停地循環(huán)變換顏色,這種效果使得它在其他普通的寶石中顯而易見。如果寶石的顏色指示它是一個彩虹寶石(它的_gemColor為常量GEMCOLOR_RAINBOW),我們會每隔0.1秒執(zhí)行一次渲染,渲染時采用不同的實際寶石顏色,Render函數(shù)的代碼如程序清單