太空入侵者游戲_第1頁
太空入侵者游戲_第2頁
太空入侵者游戲_第3頁
太空入侵者游戲_第4頁
太空入侵者游戲_第5頁
已閱讀5頁,還剩25頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、 太空入侵者游戲入侵者是一個(gè)簡單的射擊游戲。游戲運(yùn)行的初始界面如圖3.14 所示,游戲的戰(zhàn)斗場面如圖3.15 所示。 圖3.14 入侵者程序初始運(yùn)行圖 圖3.15 入侵者作戰(zhàn)運(yùn)行圖在游戲中,玩家控制飛船,一方面要向敵機(jī)射擊,另外還需要躲避敵人的子彈。直到當(dāng)前關(guān)卡中所有敵機(jī)被消滅,玩家才能進(jìn)入下一關(guān)卡。要編譯這個(gè)游戲,需要安裝DirectX 8.0 SDK 或以上版本。在這個(gè)例子中要著重強(qiáng)調(diào)子彈、獎(jiǎng)子(彈藥、獎(jiǎng)金等)、卷屏等設(shè)計(jì)技巧,以及射擊過程是如何開展的。相信通過對這個(gè)游戲的理解,讀者對射擊游戲的構(gòu)建會有更深刻的認(rèn)識。3.7.1 獎(jiǎng)子的設(shè)計(jì)獎(jiǎng)子是射擊類游戲中必有的精靈,獎(jiǎng)子實(shí)際就是玩家操作的

2、飛船打掉敵機(jī)后,電腦獎(jiǎng)賞的獎(jiǎng)金、彈藥、防彈服等。不過要想真正擁有這些獎(jiǎng)子,玩家操縱的精靈必須在獎(jiǎng)子消失(掉落到屏幕之外或者在規(guī)定時(shí)間內(nèi)消失)之前“吃”掉它。“吃”實(shí)際上是一種碰撞檢測行為。而在吃掉獎(jiǎng)子之前,獎(jiǎng)子通常會自動下落。如圖3.16 所示是入侵者游戲中的獎(jiǎng)子原始圖。Extras.bmp 圖片的分辨率是125500。 圖3.16 入侵者中的獎(jiǎng)子源視圖extras.bmp從圖中不難看出入侵者中有5 種獎(jiǎng)子,每種獎(jiǎng)子有20 幀動畫。由于extras 的分辨率是125500,所以平均每個(gè)獎(jiǎng)子的每一幀是一幅2525 分辨率的圖像。在入侵者中,單獨(dú)設(shè)計(jì)了一個(gè)獎(jiǎng)子類Extra:class Extrap

3、rivate:int x; /獎(jiǎng)子在屏幕中的位置int y;RECT rcLastPos; /獎(jiǎng)子上次出現(xiàn)在屏幕中的包圍盒坐標(biāo)int iType; /獎(jiǎng)子類型,從extras.bmp 中可以看出共有5 種類型Extra* pNext; /獎(jiǎng)子鏈表Extra* pPrev;public:int frame; /幀編號,從extras.bmp 中可以看出共有20 幀Extra()x = 0;y = 0;pNext = NULL;pPrev = NULL;frame = 0;iType = 0;rcLastPos.left = 0;rcLastPos.top = 0;第3 章2D 游戲開發(fā)121rc

4、LastPos.right = 0;rcLastPos.bottom = 0;int GetType()return iType;void SetType(int iNewType)iType = iNewType;int GetX()return x;int GetY()return y;void Move(int Qtde)rcLastPos.left = x;rcLastPos.top = y;rcLastPos.right = x + 25;rcLastPos.bottom = y + 25;if (rcLastPos.bottom 455)rcLastPos.bottom = 455

5、;/Qtde 是一個(gè)負(fù)值,因?yàn)檫@種獎(jiǎng)子都是垂直下落的,即y 值需要不斷增加y -= Qtde;void SetXY(int nx, int ny)rcLastPos.left = nx;rcLastPos.top = ny;rcLastPos.right = nx + 25;rcLastPos.bottom = ny + 25;x = nx;y = ny;Extra* GetNext()return pNext;122 Visual C+游戲開發(fā)技術(shù)與實(shí)例Extra* GetPrev()return pPrev;void SetNext(Extra* nNext)pNext = nNext;v

6、oid SetPrev(Extra* nPrev)pPrev = nPrev;BOOL Draw(LPDIRECTDRAWSURFACE7 lpOrigin, LPDIRECTDRAWSURFACE7 lpSource)RECT rcRect;HRESULT hRet;int iClipTop;int iClipBottom;/子彈在超出屏幕上方(y 值小于0)和跨過屏幕下方(y+255455)的時(shí)候需要進(jìn)行裁剪if (y 455)iClipBottom = y+25-455;elseiClipBottom = 0;rcRect.left = frame * 25;rcRect.top = (

7、iType - 1) * 25) + iClipTop;rcRect.right = frame * 25 + 25;rcRect.bottom = (iType - 1) * 25) + 25 - iClipBottom;/幀數(shù)編號加1frame+;if (frame = 20)frame = 0;while (1)hRet=lpOrigin-BltFast(x,y,lpSource,&rcRect,DDBLTFAST_SRCCOLORKEY);if (hRet = DD_OK)break;if (hRet = DDERR_SURFACELOST)第3 章2D 游戲開發(fā)123return F

8、ALSE;if (hRet != DDERR_WASSTILLDRAWING)break;return TRUE;很顯然,Extra 中私有成員變量x、y 表示獎(jiǎng)子方塊左上角在屏幕上的像素坐標(biāo)(事實(shí)上這兩個(gè)變量并不是必需的);而矩形結(jié)構(gòu)rcLastPos 表示獎(jiǎng)子上次出現(xiàn)在屏幕時(shí)的坐標(biāo);整形的iType 表示獎(jiǎng)子類型,這里共有5 種類型的獎(jiǎng)子。公有變量frame 表示幀編號,每種獎(jiǎng)子都有20 幀。在Extra 中_讀者可能有疑惑的地方就是成員變量pNext 和pPrev,因?yàn)閺拿Q上讀者就能猜出Extra 變成了一種鏈表結(jié)構(gòu)。這么做的理由很簡單,因?yàn)槠聊恢锌赡芡瑫r(shí)出現(xiàn)多個(gè)獎(jiǎng)子,所以為了獎(jiǎng)子管理

9、的需要,不妨將其設(shè)置成鏈表結(jié)構(gòu)。Extra 中成員函數(shù)都比較簡單,需要關(guān)注的只有Move 函數(shù)和Draw 函數(shù)。Move 函數(shù)中出現(xiàn)的常數(shù)25 是由獎(jiǎng)子圖像的長度、寬度(2525)決定的;而語句rcLastPos.bottom455 是用來判斷獎(jiǎng)子是否已經(jīng)掉出屏幕之外(確切的說是屏幕下限);語句y-=Qtde 表示獎(jiǎng)子是垂直下落的,參數(shù)Qtde 實(shí)際是一個(gè)負(fù)值,后面會看到這個(gè)值被設(shè)置成3。Draw 函數(shù)中,首先碰到的問題就是對獎(jiǎng)子的裁剪。裁剪解決的方法是當(dāng)精靈在屏幕之外時(shí),計(jì)算實(shí)際需要繪制精靈的部分。在Draw 函數(shù)里,裁剪操作如下:if (y 455)iClipBottom = y+25-4

10、55;elseiClipBottom = 0;rcRect.left = frame * 25;rcRect.top = (iType - 1) * 25) + iClipTop;rcRect.right = frame * 25 + 25;rcRect.bottom = (iType - 1) * 25) + 25 - iClipBottom;當(dāng)y 小于0,表示當(dāng)前獎(jiǎng)子在屏幕上方(但不一定完全在上方),所以需要裁剪掉獎(jiǎng)子的上半部分,iClipTop 指定了在2525 圖像中,實(shí)際要繪制的頂部y 值。當(dāng)y+25455,表示當(dāng)前獎(jiǎng)子已經(jīng)掉落到屏幕的下方(但不一定完全掉落),所以需要裁剪掉獎(jiǎng)子的下

11、半部分,iClipBottom 指定了在2525 圖像中,實(shí)際要繪制的底部y 值。如果這兩個(gè)條件都不滿足,則說明獎(jiǎng)子完全落在屏幕內(nèi),需要完整繪制。裁剪計(jì)算完成后,需要調(diào)整幀數(shù),每種獎(jiǎng)子都有20 幀。frame+;if (frame = 20)frame = 0;當(dāng)然,這段代碼可以簡化成“(frame+)20”。幀調(diào)整完成后,繪制獎(jiǎng)子。124 Visual C+游戲開發(fā)技術(shù)與實(shí)例lpOrigin-BltFast(x, y, lpSource, &rcRect, DDBLTFAST_SRCCOLORKEY);在入侵者的主框架中定義了一個(gè)全局獎(jiǎng)子對象Extra*pExtra。因?yàn)镋xtra 是一種鏈

12、表結(jié)構(gòu),所以在pExtra 中記錄了當(dāng)前屏幕中所有獎(jiǎng)子。而主框架中繪制獎(jiǎng)子的函數(shù)DrawExtra 定義如下。void DrawExtra()/ 繪制屏幕中所有獎(jiǎng)子(獎(jiǎng)金、彈藥等)Extra* pFirstExtra;Extra* pNextExtra = NULL;Extra* pLastExtra = NULL;Extra* pPrevExtra = NULL;/保存這個(gè)全局指針。因?yàn)楹竺娴牟僮鲿淖冞@個(gè)指針,而最后還要恢復(fù)它pFirstExtra = pExtra;/因?yàn)楫?dāng)前屏幕中可能有多個(gè)獎(jiǎng)子,所以這里使用while 語句就是要將所有的獎(jiǎng)子都繪制出來/當(dāng)前屏幕中的獎(jiǎng)子都被保存在同一個(gè)獎(jiǎng)

13、子鏈表中,所以繪制所有獎(jiǎng)子時(shí)要求遍歷整個(gè)獎(jiǎng)子隊(duì)列while (pExtra != NULL)/傳入的是-3,即每次掉落3 個(gè)像素點(diǎn)pExtra-Move(-3);/繪制當(dāng)前節(jié)點(diǎn)獎(jiǎng)子,lpExtra 是extras.bmp 的DDraw 的SurfacepExtra-Draw(lpBackBuffer,lpExtra);/如果當(dāng)前的獎(jiǎng)子已經(jīng)掉落到屏幕以外,則調(diào)整獎(jiǎng)子列表,刪除當(dāng)前獎(jiǎng)子節(jié)點(diǎn)if (pExtra-GetY() 455)/調(diào)整獎(jiǎng)子鏈表節(jié)點(diǎn)和相關(guān)指針if (pPrevExtra != NULL)pPrevExtra-SetNext( pExtra-GetNext() );pNextExt

14、ra = pExtra-GetNext();if (pNextExtra != NULL)pNextExtra-SetPrev(pPrevExtra);/如果當(dāng)前獎(jiǎng)子節(jié)點(diǎn)位于鏈表中的第一位置,則還需要再調(diào)整鏈表if (pExtra = pFirstExtra)pFirstExtra=pExtra-GetNext();/刪除當(dāng)前獎(jiǎng)子節(jié)點(diǎn)delete(pExtra);/重置當(dāng)前獎(jiǎng)子節(jié)點(diǎn)pExtra = pNextExtra;else/遍歷獎(jiǎng)子鏈表:當(dāng)前獎(jiǎng)子節(jié)點(diǎn)指向鏈表中下一個(gè)節(jié)點(diǎn)pPrevExtra = pExtra;第3 章2D 游戲開發(fā)125pExtra = pExtra-GetNext();

15、pExtra = pFirstExtra;事實(shí)上,DrawExtra 中很大部分的工作都是對Extra 鏈表的操作。最后的問題就是如何“吃”獎(jiǎng)子?在前面已經(jīng)提過了,這是一個(gè)碰撞檢測問題。在主框架中定義了“吃”獎(jiǎng)子函數(shù)CheckHitExtra。通常“吃”獎(jiǎng)子的碰撞檢測采用的是最簡單的矩形包圍盒技術(shù),這里正是用了這種方法。當(dāng)然“吃”完了獎(jiǎng)子后,必須把它從獎(jiǎng)子鏈表中刪除。int CheckHitExtra(void)Extra *pFirstExtra, *pPrevExtra, *pNextExtra;int iReturn = 0;pPrevExtra = NULL;pNextExtra =

16、NULL;pFirstExtra = pExtra;/檢測所有獎(jiǎng)子是否和飛船發(fā)生了碰撞while (pExtra != NULL)/如果獎(jiǎng)子在飛船的矩形包圍盒內(nèi),則說明發(fā)生了“吃”的操作/一旦吃掉,則需要?jiǎng)h掉該獎(jiǎng)子,同時(shí)調(diào)整鏈表if (pExtra-GetX() = iShipPos &pExtra-GetX() GetY() 385 &pExtra-GetY() GetType() != 0)if (pPrevExtra != NULL)pPrevExtra-SetNext( pExtra-GetNext() );pNextExtra = pExtra-GetNext();if (pNext

17、Extra != NULL)pNextExtra-SetPrev(pPrevExtra);if (pExtra = pFirstExtra)pFirstExtra=pExtra-GetNext();iReturn = pExtra-GetType();delete(pExtra);pExtra = pFirstExtra;return iReturn;pPrevExtra = pExtra;pExtra = pExtra-GetNext();pExtra = pFirstExtra;return iReturn;126 Visual C+游戲開發(fā)技術(shù)與實(shí)例3.7.2 子彈(Bullet)的設(shè)計(jì)

18、在入侵者中子彈的設(shè)計(jì)幾乎是和獎(jiǎng)子的設(shè)計(jì)一樣的,只是在圖像的寬度和高度上需要進(jìn)行調(diào)整。讀者不妨查看類Bullet,然后再和Extra 類做個(gè)比較。不過子彈的設(shè)計(jì)并不是一成不變的。在游戲設(shè)計(jì)中,子彈的設(shè)計(jì)方式和方法很多,這里只是采用了靜態(tài)的直線傳遞方法。子彈的彈道通常決定了子彈設(shè)計(jì)的方式。例如,很多游戲中的追蹤彈、散花彈和激光彈等。對于追蹤彈來說,它會自動鎖定目標(biāo),當(dāng)然這并不意味著一定能夠擊落敵機(jī)。通常情況下,敵機(jī)如果可以將追蹤彈引出屏幕之外就算追蹤彈無效,這是很公平的決策。在追蹤彈設(shè)計(jì)中,彈道的設(shè)計(jì)需要平滑,因?yàn)檎劬€式的追蹤軌跡并不現(xiàn)實(shí)。平滑的方法很多,樣條曲線就是一個(gè)不錯(cuò)的選擇,在第4 章中會

19、介紹到一種3 次樣條曲線的設(shè)計(jì)方法。對于散花彈而言,可以考慮成由多個(gè)單一的子彈組成,不過這種方法需要考慮效率。而激光彈是一種特殊的子彈,它的有效攻擊范圍實(shí)際是會變化的。這種子彈的設(shè)計(jì)需要考慮真實(shí)世界的激光。當(dāng)打開激光源的時(shí)候,光會快速的形成一條射線,在這條軌跡內(nèi)的任何物體實(shí)際上都會被激光照射,而當(dāng)關(guān)閉激光源的時(shí)候,激光總是消失在遠(yuǎn)處。根據(jù)這種物理規(guī)律,才能夠設(shè)計(jì)出比較合理的激光子彈。3.7.3 卷屏(Scroll)的設(shè)計(jì)在入侵者游戲中,為了體現(xiàn)游戲中的飛船處于飛行狀態(tài),采用了一種簡單的卷屏技術(shù)。這種卷屏技術(shù)是利用背景圖片的變化實(shí)現(xiàn)的。如圖3.17 所示是入侵者的背景圖片。它是640480 分辨

20、率的圖片。而該圖片中底部的狀態(tài)欄占據(jù)了25 個(gè)像素的高度。圖3.17 背景圖片卷屏函數(shù)DrawInvalidBackGround 定義如下:void DrawInvalidBackGround()/重繪背景RECT rcRect;HRESULT hRet;Static y = 0;const int iFim = 455;/新關(guān)卡第3 章2D 游戲開發(fā)127if (lastTickCount = 0)y =0;/向下卷屏一個(gè)像素y += 1;/如果已經(jīng)卷完455 個(gè)像素(即一個(gè)屏幕),則y 值重新置0。if (yiFim)y = 0;/上半屏的矩形區(qū)域rcRect.left = 0;rcRec

21、t.top = 0;rcRect.right = 640;rcRect.bottom = iFim-y;while (1)hRet = lpBackBuffer-BltFast(0, y, lpBkGround,&rcRect, DDBLTFAST_NOCOLORKEY);if (hRet = DD_OK)break;if (hRet = DDERR_SURFACELOST)hRet = RestoreSurfaces();if (hRet != DD_OK)break;if (hRet != DDERR_WASSTILLDRAWING)break;/下半屏的矩形區(qū)域rcRect.left =

22、 0;rcRect.top = iFim-y;rcRect.right = 640;rcRect.bottom = iFim;while (1)hRet = lpBackBuffer-BltFast(0, 0, lpBkGround,&rcRect, DDBLTFAST_NOCOLORKEY);if (hRet = DD_OK)break;if (hRet = DDERR_SURFACELOST)hRet = RestoreSurfaces();128 Visual C+游戲開發(fā)技術(shù)與實(shí)例if (hRet != DD_OK)break;if (hRet != DDERR_WASSTILLDRA

23、WING)break;DrawInvalidBackGround 函數(shù)使用的卷屏方法是將背景圖片從水平方向分成兩個(gè)部分,然后分別繪制上下部分的圖片。背景圖片的分割線是從關(guān)卡開始后背景下降的y 值累加之和。每次繪制背景的時(shí)候y 值都要增加1 個(gè)像素,直到y(tǒng) 值等于455(480 中包括了25 個(gè)像素高度的狀態(tài)欄)后重置為0。通過這樣的兩次背景繪制,屏幕就動了起來。需要指出的是,對于一些復(fù)雜的橫板卷屏游戲而言,這種方法就完全行不通了。因?yàn)闄M板游戲的背景中包含了復(fù)雜的地形,這種地形是影響游戲發(fā)展的,而不像在入侵者中背景對整個(gè)游戲進(jìn)程毫無影響。上面的DrawInvalidBackGround 函數(shù)是在

24、UpdateFrame 中被調(diào)用的,而UpdateFrame 函數(shù)負(fù)責(zé)的是整個(gè)游戲狀態(tài)的刷新。其中屏幕刷新的時(shí)候,遵守一個(gè)刷新順序:背景刷新、獎(jiǎng)子刷新、敵機(jī)刷新、子彈刷新、飛船刷新。下面來看看UpdateFrame 函數(shù)是如何工作的。UpdateFrame 函數(shù)在開始部分定義了一些局部變量:void UpdateFrame( void )int ddrval;DWORD thisTickCount;RECT rcRect;DWORD delay = 18;static int frame = 0;HBITMAP hbm;DDBLTFX ddbltfx;HRESULT hRet;接著,它判斷飛船

25、是否已經(jīng)爆炸了一段時(shí)間。如果是這樣,則載入游戲結(jié)束的畫面,重置一些全局變量。thisTickCount = GetTickCount();if (thisTickCount - dwShipExplode 2000 &iShipState = 3)Ovni* auxpUFO;Bullet* auxpBullet;while(pUFO !=NULL)auxpUFO = pUFO-GetNext();delete(pUFO);pUFO = auxpUFO;while(pBullet !=NULL)auxpBullet = pBullet-GetNext();第3 章2D 游戲開發(fā)129delete

26、(pBullet);pBullet = auxpBullet;ShowGameOver();lastTickCount = 0;iAppState = 0;iShipState = 0;下面判斷當(dāng)前游戲處于何種狀態(tài)。其中APP_MAINMENU 標(biāo)志表示當(dāng)前游戲處于主菜單狀態(tài);APP_GAMESCREEN 標(biāo)志表示游戲已經(jīng)開始;APP_CREDITS 表示游戲處于顯示積分的狀態(tài);APP_HELPSCREEN 表示游戲處于幫助屏幕狀態(tài)。switch (iAppState)case APP_MAINMENU:/如果時(shí)間間隔過短,則返回if (thisTickCount - lastTickCoun

27、t) Blt(&rcRect,NULL,NULL,DDBLT_COLORFILL,&ddbltfx);if (hRet = DD_OK)break;if (hRet = DDERR_SURFACELOST)hRet = RestoreSurfaces();if (hRet != DD_OK)break;if (hRet != DDERR_WASSTILLDRAWING)break;/當(dāng)前菜單選擇光標(biāo)幀的矩形區(qū)域rcRect.left = frame * 32;rcRect.right = (frame * 32) + 32;rcRect.top = 0;rcRect.bottom = 20;w

28、hile (1)/繪制這個(gè)光標(biāo)hRet = lpBackBuffer-BltFast(150 , 275+ (40 * iOption), lpSelect, &rcRect,TRUE);if (hRet = DD_OK)break;if (hRet = DDERR_SURFACELOST)hRet = RestoreSurfaces();if (hRet != DD_OK)break;if (hRet != DDERR_WASSTILLDRAWING)第3 章2D 游戲開發(fā)131break;/幀數(shù)自增frame+;if (frame 19)frame = 0;while( 1 )/前后臺交換

29、緩沖區(qū)ddrval = lpFrontBuffer-Flip(NULL, 0 );if( ddrval = DD_OK )break;if( ddrval = DDERR_SURFACELOST )if( !RestoreSurfaces() )return;if( ddrval != DDERR_WASSTILLDRAWING )break;/重置上次時(shí)間lastTickCount = thisTickCount;return;case APP_GAMESCREEN:int iAmmo;/游戲剛開始,初始化if (lastTickCount = 0)bShoot = FALSE;/設(shè)置界面中

30、的矩形區(qū)域rcRect.left = 0;rcRect.top = 0;rcRect.right = 640;rcRect.bottom = 480;/設(shè)置前臺和后臺緩沖DrawBackGround(lpBackBuffer,0,455,640,480);DrawBackGround(lpFrontBuffer,0,455,640,480);/在狀態(tài)欄中繪制生命值DrawShield();132 Visual C+游戲開發(fā)技術(shù)與實(shí)例/如果得分發(fā)生變化,則在狀態(tài)欄中重繪得分if (Lastscore != score)DrawBackGround(lpBackBuffer,510,460,640

31、,477);DrawBackGround(lpFrontBuffer,510,460,640,477);DrawScore(510,460);Lastscore = score;/如果武器不一樣則重繪武器if (iLastWeapon != iWeapon)DrawBackGround(lpBackBuffer, 84,458, 172,477);DrawBackGround(lpFrontBuffer,84,458, 172,477);DrawWeapon();iLastWeapon = iWeapon;iLastAmmo = -1;if (iWeapon 3)iAmmo = iLaserA

32、mmo;elseiAmmo = iPhotonAmmo;if (iLastAmmo != iAmmo)DrawBackGround(lpBackBuffer,241,459,300,477);DrawBackGround(lpFrontBuffer,241,459,300,477);DrawAmmo();iLastAmmo = iAmmo;if (thisTickCount - lastTickCount) Flip(NULL, 0 );if( ddrval = DD_OK )break;if( ddrval = DDERR_SURFACELOST )if( !RestoreSurfaces(

33、) )return;if( ddrval != DDERR_WASSTILLDRAWING )break;lastTickCount = GetTickCount();break;case APP_CREDITS: /顯示屏幕積分ShowCredits();iAppState = 0;lastTickCount = 0;break;case APP_HELPSCREEN: /顯示幫助屏幕static BOOL bBlink;static DWORD dwTime;if (thisTickCount - lastTickCount) Blt(&rcRect,NULL,NULL,DDBLT_COL

34、ORFILL,&ddbltfx);if (hRet = DD_OK)break;134 Visual C+游戲開發(fā)技術(shù)與實(shí)例if (hRet = DDERR_SURFACELOST)hRet = RestoreSurfaces();if (hRet != DD_OK)break;if (hRet != DDERR_WASSTILLDRAWING)break;while (1)hRet = lpBackBuffer-Blt(&rcRect, NULL, NULL, DDBLT_COLORFILL,&ddbltfx);if (hRet = DD_OK)break;if (hRet = DDERR_

35、SURFACELOST)hRet = RestoreSurfaces();if (hRet != DD_OK)break;if (hRet != DDERR_WASSTILLDRAWING)break;bltText(PHOTON AMMO0,90,45);bltText(WEAPON ADVANCE0,90,95);bltText(100 POINTS BONUS0,90,145);bltText(LASER AMMO0,90,195);bltText(SHIELD CHARGE0,90,245);bltText(LEFT, RIGHT - MOVE SHIP0,50,290);bltTex

36、t(DOWN OR ENTER - STOP SHIP0,50,325);bltText(CTRL - CHANGE WEAPON0,50,360);bltText(PRESS ANY KEY TO CONTINUE0,140,450);bBlink = FALSE;dwTime = 0;ddbltfx.dwSize = sizeof( ddbltfx );ddbltfx.dwFillColor = dwFillColor;rcRect.left = 50;rcRect.top = 40;rcRect.right = 75;rcRect.bottom = 270;while (1)hRet=l

37、pBackBuffer-Blt(&rcRect,NULL,NULL,DDBLT_COLORFILL,&ddbltfx);第3 章2D 游戲開發(fā)135if (hRet = DD_OK)break;if (hRet = DDERR_SURFACELOST)hRet = RestoreSurfaces();if (hRet != DD_OK)break;if (hRet != DDERR_WASSTILLDRAWING)break;if (bBlink = TRUE)ddbltfx.dwSize = sizeof( ddbltfx );ddbltfx.dwFillColor = dwFillColo

38、r;rcRect.left = 0;rcRect.top = 450;rcRect.right = 640;rcRect.bottom = 475;while (1)hRet = lpBackBuffer-Blt(&rcRect, NULL, NULL, DDBLT_COLORFILL,&ddbltfx);if (hRet = DD_OK)break;if (hRet = DDERR_SURFACELOST)hRet = RestoreSurfaces();if (hRet != DD_OK)break;if (hRet != DDERR_WASSTILLDRAWING)break;dwTim

39、e = dwTime + 1;if (dwTime = 20)bltText(PRESS ANY KEY TO CONTINUE0,140,450);bBlink = FALSE;dwTime = 0;elsedwTime = dwTime + 1;if (dwTime = 20)136 Visual C+游戲開發(fā)技術(shù)與實(shí)例/bltText(PRESS ANY KEY TO CONTINUE0,140,450);bBlink = TRUE;dwTime = 0;rcRect.left = frame * 25;rcRect.right = (frame * 25) + 25;rcRect.to

40、p = 0;rcRect.bottom = 25;while (1)hRet = lpBackBuffer-BltFast(50, 40, lpExtra, &rcRect, TRUE);if (hRet = DD_OK)break;if (hRet = DDERR_SURFACELOST)hRet = RestoreSurfaces();if (hRet != DD_OK)break;if (hRet != DDERR_WASSTILLDRAWING)break;rcRect.top = 25;rcRect.bottom = 50;while (1)hRet = lpBackBuffer-B

41、ltFast(50,90,lpExtra,&rcRect,TRUE);if (hRet = DD_OK)break;if (hRet = DDERR_SURFACELOST)hRet = RestoreSurfaces();if (hRet != DD_OK)break;if (hRet != DDERR_WASSTILLDRAWING)break;rcRect.top = 50;rcRect.bottom = 75;while (1)hRet = lpBackBuffer-BltFast(50, 140, lpExtra, &rcRect, TRUE);if (hRet = DD_OK)第3 章2D 游戲開發(fā)137break;if (hRet = DDERR_SURFACELOST)hRet = RestoreSurfaces();if (hRet != DD_OK)break;if (hRet != DDERR_WASSTILLDRAWING)break;rcRect.top = 75;rcRect.bottom = 100

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論