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