C++實(shí)訓(xùn)報(bào)告.doc_第1頁
C++實(shí)訓(xùn)報(bào)告.doc_第2頁
C++實(shí)訓(xùn)報(bào)告.doc_第3頁
C++實(shí)訓(xùn)報(bào)告.doc_第4頁
C++實(shí)訓(xùn)報(bào)告.doc_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

_實(shí) 訓(xùn) 報(bào) 告飛機(jī)大戰(zhàn)游戲設(shè)計(jì)與開發(fā)姓名* 專業(yè)名稱: 數(shù)學(xué)專業(yè)班 級: * 學(xué) 號: *信息科學(xué)與工程學(xué)院二零一三年十一月-可編輯修改-目 錄1.概述22. 相關(guān)技術(shù) 22.1獲取矩形區(qū)域函數(shù)22.2添加爆炸效果函數(shù)22.3彈出對話框函數(shù)32.4字體的個性化輸出函數(shù)42.5鍵盤控制戰(zhàn)機(jī)位置和發(fā)射子彈的函數(shù)42.6設(shè)置定時(shí)器42.7雙緩沖技術(shù)52.8內(nèi)存釋放技術(shù)53.需求分析53.1功能需求分析53.2 數(shù)據(jù)需求分析63.3 行為需求分析64. 總體設(shè)計(jì)與詳細(xì)設(shè)計(jì) 64.1系統(tǒng)模塊劃分84.2主要功能模塊84.3擴(kuò)展功能設(shè)計(jì)思路95. 編碼實(shí)現(xiàn) 9 6. 測試情況說明 246.1主要模塊測試情況(白盒) 246.2 主要功能測試情況(黑盒)247. 實(shí)訓(xùn)中遇到的主要問題及解決方法 258. 實(shí)訓(xùn)體會 25 1. 概述飛機(jī)大戰(zhàn)游戲是基于Windows桌面的射擊類游戲。做為一個游戲首先要保證游戲本身的規(guī)則,而這個版本的一個重要的功能就是其2D的展現(xiàn)形式。飛機(jī)大戰(zhàn)游戲作為PC中一款桌面游戲,界面簡潔流暢、游戲方式簡單,玩起來易于上手。其實(shí)現(xiàn)的功能為:實(shí)現(xiàn)游戲?qū)ο蟮谋ㄌ匦А⒙曇籼匦?、文字提示功能和界面背景,其主要是遵循一定的游戲?guī)則進(jìn)行游戲。游戲中的主要角色可分為如下幾個基本部分:戰(zhàn)機(jī)、敵機(jī)、戰(zhàn)機(jī)的導(dǎo)彈、敵機(jī)的子彈。其主要遵循的游戲規(guī)則為:戰(zhàn)機(jī)數(shù)量為1;由玩家通過鍵盤控制(方向鍵控制位置、空格鍵發(fā)射導(dǎo)彈)戰(zhàn)機(jī);導(dǎo)彈釋放存在間隔,有一定的運(yùn)行速度;導(dǎo)彈遇到敵機(jī)發(fā)生爆炸,敵機(jī)被炸毀,玩家得分;由計(jì)算機(jī)控制敵機(jī)自動向戰(zhàn)機(jī)發(fā)動攻擊;敵機(jī)數(shù)量隨機(jī),計(jì)算機(jī)生成敵機(jī)時(shí)隨機(jī)選擇位置;敵機(jī)從游戲區(qū)域的上下兩端進(jìn)入;敵機(jī)行駛期間,不左右移動,不反向移動;敵機(jī)發(fā)射炸彈對戰(zhàn)機(jī)進(jìn)行攻擊,運(yùn)行線路為直線,方向?yàn)閺南轮辽希驈南轮辽?,不可左右移動,敵機(jī)炸彈擊中戰(zhàn)機(jī),戰(zhàn)機(jī)生命值減1。該游戲有關(guān)卡,戰(zhàn)機(jī)生命值減為0,游戲結(jié)束,選擇是否重新開始;戰(zhàn)機(jī)仍有生命值時(shí),并且得到要求的分?jǐn)?shù)可進(jìn)入下一關(guān)。2. 相關(guān)技術(shù)此次實(shí)訓(xùn)的飛機(jī)大戰(zhàn)游戲其中的技術(shù)主要就是一些函數(shù)(獲取矩形區(qū)域函數(shù)、添加爆炸效果函數(shù)、彈出對話框函數(shù)、字體的個性化輸出函數(shù)、鍵盤控制戰(zhàn)機(jī)位置和發(fā)射子彈的函數(shù))、設(shè)置定時(shí)器、內(nèi)存釋放和雙緩沖技術(shù)。2.1獲取矩形區(qū)域函數(shù)CRect CBomb:getRect(void)return CRect(CPoint(Pos.x,Pos.y),CPoint(Pos.x+55,Pos.y+20);CRect bombRect = bomb-getRect();CRect CEnemy:getRect(void)return CRect(CPoint(Pos.x,Pos.y),CPoint(Pos.x+35,Pos.y+35);CRect enemyRect = enemy-getRect();CRect tempRect;tempRect.IntersectRect(&bombRect,enemyRect)/判斷兩個矩形是否有交接2.2添加爆炸效果函數(shù)PlaySound(LPCTSTR)IDR_WAVE2,AfxGetInstanceHandle(),SND_RESOURCE|SND_ASYNC);/此函數(shù)用于將ID為IDR_WAVE1的音頻在執(zhí)行此語句時(shí)進(jìn)行播放。2.3彈出對話框函數(shù)if(AfxMessageBox(LGAME OVER!重新開始?,MB_YESNO)=1)/清空敵機(jī)鏈表ListEnemy1.RemoveAll();ListEnemy2.RemoveAll();/清空敵機(jī)炸彈鏈表ListBall1.RemoveAll();ListBall2.RemoveAll();/清空戰(zhàn)機(jī)子彈鏈表ListBomb1.RemoveAll();ListBomb2.RemoveAll();/清空爆炸鏈表ListExplosion.RemoveAll();/添加新的戰(zhàn)機(jī)對象/*myplane = new CMyPlane;*/myscore=0;lifeNum = 20;SetTimer(1,100,NULL);/ifelseexit(1);/此函數(shù)主要是彈出對話框供用戶進(jìn)行選擇,當(dāng)用戶點(diǎn)擊確定按鈕時(shí)執(zhí)行此函數(shù)的內(nèi)的語句進(jìn)行繼續(xù)運(yùn)行。2.4字體的個性化輸出函數(shù)HFONT font;font=CreateFont(20,10,0,0,0,0,0,0,0,0,0,100,10,0);MemDC.SelectObject(font);CString str;MemDC.SetTextColor(RGB(239,7,7);MemDC.SetBkColor(RGB(0,0,0);str.Format(_T(游戲得分:%d),myscore);MemDC.TextOut(10,10,str);str.Format(_T(剩余生命:%d),lifeNum);MemDC.TextOut(10,30,str);str.Format(_T(當(dāng)前關(guān)卡:%d),passnum);MemDC.TextOut(10,50,str);2.5鍵盤控制戰(zhàn)機(jī)位置和發(fā)射子彈的函數(shù)if (GetKeyState(VK_LEFT)rect.left)myplane.move(1);if (GetKeyState(VK_RIGHT)0)if(myplane.Pos.xrect.right-50)myplane.move(2);if (GetKeyState(VK_UP)rect.top)myplane.move(3);if (GetKeyState(VK_DOWN)0)if(myplane.Pos.yrect.bottom-50)myplane.move(4);if (GetKeyState(VK_SPACE)SetTimer(1,100,0); /設(shè)置每100毫秒刷新一次2.7雙緩沖技術(shù)關(guān)于雙緩沖技術(shù)主要就是利用緩存的原理進(jìn)行將所有的東西都先存在一個緩沖得虛擬的區(qū)域,然后再一次性的將所有的虛擬緩存中的東西都放入實(shí)在的存儲器中。/定義一個位圖對象CBitmap MemBitmap;CDC MemDC;/這時(shí)還不能繪圖,因?yàn)闆]有位圖的設(shè)備描述表是不能繪圖的/只有選入了位圖的設(shè)備描述表才有地方繪圖,畫到指定的位圖上MemDC.CreateCompatibleDC(pDC);/下面建立一個與屏幕設(shè)備描述表(或者內(nèi)存設(shè)備描述表)兼容的位圖MemBitmap.CreateCompatibleBitmap(pDC,rect.right,rect.bottom);CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);/將位圖選入到內(nèi)存設(shè)備描述表MemDC.StretchBlt(0,0,rect.Width(),rect.Height(),&cdc_BackGround,0,0,bimap2.bmWidth,bimap2.bmHeight,SRCCOPY);/繪圖完成后的清理pDC-BitBlt(rect.left,rect.top,rect.right,rect.bottom,&MemDC,0,0,SRCCOPY);MemBitmap.DeleteObject();MemDC.DeleteDC();2.8 內(nèi)存釋放技術(shù)在此次實(shí)訓(xùn)項(xiàng)目中有太多的對象的生成和運(yùn)用,造成了內(nèi)存的極度的緊張,當(dāng)游戲進(jìn)行到一定的程度的時(shí)候就會出現(xiàn)內(nèi)存溢出現(xiàn)象。解決此問題的技術(shù)就是內(nèi)存釋放。內(nèi)存釋放技術(shù)的實(shí)現(xiàn)主要是通過釋放各個滿足一定條件的對象和鏈表來實(shí)現(xiàn)的,/爆炸后刪除子彈ListBomb1.RemoveAt(bombTemp);delete bomb;/刪除敵機(jī)ListEnemy1.RemoveAt(enemyTemp);delete enemy;3. 需求分析3.1功能需求分析游戲基本規(guī)則飛機(jī)對戰(zhàn)規(guī)則游戲特效界面背景特效游戲?qū)ο筇匦曇籼匦淖痔崾?.2數(shù)據(jù)需求分析 戰(zhàn)機(jī)數(shù)量為1,敵機(jī)數(shù)量隨機(jī)隨機(jī)產(chǎn)生,當(dāng)戰(zhàn)機(jī)被擊中時(shí)生命值減1,戰(zhàn)機(jī)與敵機(jī)相撞生命值減1,戰(zhàn)機(jī)擊中敵機(jī)分?jǐn)?shù)加1,戰(zhàn)機(jī)生命值減到0時(shí),游戲結(jié)束,生命值大于0并且分?jǐn)?shù)到達(dá)一定要求時(shí)進(jìn)入下一關(guān)。上方敵機(jī)、下方敵機(jī)、上方敵機(jī)的炸彈、下方敵機(jī)的炸彈、戰(zhàn)機(jī)的兩排導(dǎo)彈均以鏈表存儲。當(dāng)戰(zhàn)機(jī)與敵機(jī)相撞時(shí)敵機(jī)從該鏈表刪除,導(dǎo)彈擊中敵機(jī)時(shí),敵機(jī)從該鏈表刪除,導(dǎo)彈從該鏈表刪除。3.3行為需求分析戰(zhàn)機(jī)上下移動,通過鼠標(biāo)或鍵盤控制位置,空格鍵發(fā)射導(dǎo)彈;敵機(jī)出現(xiàn)位置隨機(jī),從上方出現(xiàn),或從下方出現(xiàn),發(fā)射子彈攻擊戰(zhàn)機(jī),敵機(jī)可以與戰(zhàn)機(jī)相撞。當(dāng)戰(zhàn)機(jī)生命值為0時(shí),提示游戲結(jié)束是否進(jìn)入下一關(guān),當(dāng)分?jǐn)?shù)值到達(dá)一定要求時(shí)提示恭喜過關(guān)是否進(jìn)入下一關(guān)。4. 總體設(shè)計(jì)與詳細(xì)設(shè)計(jì)總體設(shè)計(jì)主要課將其分為兩大部分:規(guī)則子系統(tǒng),游戲?qū)ο笞酉到y(tǒng)。系統(tǒng)的總體結(jié)構(gòu)圖如下:規(guī)則子系統(tǒng)主要是實(shí)現(xiàn)飛機(jī)大戰(zhàn)各項(xiàng)游戲規(guī)則。實(shí)現(xiàn)需求中的游戲規(guī)則,組成結(jié)構(gòu)圖如下:主要是實(shí)現(xiàn)敵機(jī)戰(zhàn)機(jī)的攻擊和反攻的游戲規(guī)則等來實(shí)現(xiàn)計(jì)算機(jī)方和玩家進(jìn)行對戰(zhàn)。1、主要的攻擊規(guī)則如下:1)、敵機(jī)可在戰(zhàn)機(jī)的上方或者下方進(jìn)行將子彈進(jìn)行射向戰(zhàn)機(jī),同時(shí)戰(zhàn)機(jī)也可根據(jù)玩家的指示進(jìn)行向上或者向下進(jìn)行發(fā)射導(dǎo)彈進(jìn)行反攻。2)、攻擊時(shí)發(fā)出聲音。2、主要的碰撞規(guī)則如下:1)、導(dǎo)彈或者子彈本身的矩形區(qū)域和敵機(jī)或者戰(zhàn)機(jī)的矩形區(qū)域相交時(shí),表示其相互發(fā)生碰撞表示其相互爆炸。根據(jù)實(shí)戰(zhàn)規(guī)則銷毀游戲?qū)ο蟆?)、戰(zhàn)機(jī)生命為0,戰(zhàn)機(jī)被炸,戰(zhàn)機(jī)被銷毀,游戲結(jié)束。3)、敵機(jī)或者子彈被炸毀,將其進(jìn)行銷毀同時(shí)進(jìn)行分?jǐn)?shù)的相應(yīng)的增加,并且出現(xiàn)文字提示。4)、爆炸時(shí)發(fā)出聲音。3、主要時(shí)間控制規(guī)則如下:1)、當(dāng)游戲的持續(xù)時(shí)間超過特定的時(shí)間,游戲結(jié)束,出現(xiàn)文字提示。2)、當(dāng)游戲的關(guān)卡改變時(shí)進(jìn)行游戲持續(xù)時(shí)間的一個相應(yīng)的改變。游戲?qū)ο笞酉到y(tǒng)主要包括:應(yīng)用程序?qū)ο蠛陀螒驅(qū)ο?、應(yīng)用程序?qū)ο螅?)、游戲程序的加載2)、游戲?qū)ο蟮睦L制3)、游戲規(guī)則的調(diào)用4)、玩家鍵盤鼠標(biāo)事件的獲取5、游戲?qū)ο螅?)、各游戲?qū)ο蟮膱D像加載2)、各游戲?qū)ο蟮馁N圖3)、各游戲?qū)ο蟮奈恢么鎯︻悎D如下:4.1 系統(tǒng)模塊劃分模塊名稱功能簡述應(yīng)用程序?qū)ο笥螒虺绦虻募虞d、游戲?qū)ο蟮睦L制、游戲規(guī)則的調(diào)用、玩家的鍵盤事件獲取游戲?qū)ο蟾鱾€游戲?qū)ο蟮某橄蟾割悜?zhàn)機(jī)對象戰(zhàn)機(jī)類敵機(jī)對象敵機(jī)類導(dǎo)彈對象導(dǎo)彈類炸彈對象炸彈類爆炸對象爆炸類4.2 主要功能模塊主要功能模塊主要就是那些類的功能模塊,主要有:1、各個游戲?qū)ο蟮馁N圖模塊2、敵機(jī)數(shù)量、方向、速度以及子彈的數(shù)量、方向和速度控制模塊。3、戰(zhàn)機(jī)的導(dǎo)彈的數(shù)目、方向和速度控制模塊。4、戰(zhàn)機(jī)的鍵盤控制和鼠標(biāo)控制位置模塊。5、敵機(jī)、子彈和戰(zhàn)機(jī)、導(dǎo)彈的碰撞檢測以及爆炸模塊。6、背景添加模塊。7、戰(zhàn)機(jī)速度控制模塊。8、游戲關(guān)卡游戲難易度設(shè)置和游戲關(guān)卡選擇。9、游戲得分和生命值控制以及游戲關(guān)卡進(jìn)入控制和游戲結(jié)束。10、游戲重新開始和游戲暫??刂颇K。11、游戲音效控制模塊。4.3 擴(kuò)展功能設(shè)計(jì)思路本次實(shí)訓(xùn)由于時(shí)間問題還有些擴(kuò)展功能可進(jìn)行增加,主要有:1給游戲增加敵機(jī)類型,豐富畫面,增加難度2、給游戲進(jìn)行增加boss,通過boss的添加進(jìn)行游戲的關(guān)卡和難度的更加進(jìn)一步的提升。主要思路是:再增加一個類讓它繼承敵機(jī)類,然后再敵機(jī)類的基礎(chǔ)上進(jìn)行增加其生命值和被打死后的得分。當(dāng)戰(zhàn)機(jī)得分到達(dá)一定的值以后boss出現(xiàn)并進(jìn)行和敵機(jī)一個隊(duì)伍發(fā)射另類的子彈進(jìn)行攻擊戰(zhàn)機(jī)。5. 編碼實(shí)現(xiàn)void CPLANEGAMEView:OnDraw(CDC* pDC)CPLANEGAMEDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);if (!pDoc)return;/加載圖片背景this-GetClientRect(&rect);CBitmap bitmap_BackGround;bitmap_BackGround.LoadBitmap(IDB_BACKGROUND);BITMAP bimap2;/位圖圖像bitmap_BackGround.GetBitmap(&bimap2);CDC cdc_BackGround;/定義一個兼容的DCcdc_BackGround.CreateCompatibleDC(pDC);/創(chuàng)建DCCBitmap*Old=cdc_BackGround.SelectObject(&bitmap_BackGround);/定義一個位圖對象CBitmap MemBitmap;/雙緩沖技術(shù)CDC MemDC;/這時(shí)還不能繪圖,因?yàn)闆]有位圖的設(shè)備描述表是不能繪圖的/只有選入了位圖的設(shè)備描述表才有地方繪圖,畫到指定的位圖上MemDC.CreateCompatibleDC(pDC);/下面建立一個與屏幕設(shè)備描述表(或者內(nèi)存設(shè)備描述表)兼容的位圖MemBitmap.CreateCompatibleBitmap(pDC,rect.right,rect.bottom);CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);/將位圖選入到內(nèi)存設(shè)備描述表MemDC.StretchBlt(0,0,rect.Width(),rect.Height(),&cdc_BackGround,0,0,bimap2.bmWidth,bimap2.bmHeight,SRCCOPY);/繪圖完成后的清理/畫飛機(jī)myplane.draw(&MemDC); /畫向下飛的敵機(jī) CEnemy* enemy1; POSITION pos1; for(pos1=ListEnemy1.GetHeadPosition();pos1!=NULL;) enemy1=(CEnemy*)ListEnemy1.GetNext(pos1); enemy1-draw(&MemDC); /畫向下飛的敵機(jī)的子彈CBall* ball1;POSITION posball1;for (posball1=ListBall1.GetHeadPosition();posball1!=NULL;)ball1=(CBall*)ListBall1.GetNext(posball1);ball1-draw(&MemDC); /畫向上飛的敵機(jī) CEnemy* enemy2; POSITION pos2; for(pos2=ListEnemy2.GetHeadPosition();pos2!=NULL;) enemy2=(CEnemy*)ListEnemy2.GetNext(pos2); enemy2-draw(&MemDC); /畫向上飛的敵機(jī)的子彈CBall* ball2;POSITION posball2;for (posball2=ListBall2.GetHeadPosition();posball2!=NULL;)ball2=(CBall*)ListBall2.GetNext(posball2);ball2-draw(&MemDC);/畫戰(zhàn)機(jī)的炮彈CBomb* bomb1;/第一排戰(zhàn)機(jī)炮彈POSITION POS1;for(POS1=ListBomb1.GetHeadPosition();POS1!=NULL;)bomb1=(CBomb*)ListBomb1.GetNext(POS1);bomb1-draw(&MemDC);CBomb* bomb2;/第二排戰(zhàn)機(jī)炮彈POSITION POS2;for(POS2=ListBomb2.GetHeadPosition();POS2!=NULL;)bomb2=(CBomb*)ListBomb2.GetNext(POS2);bomb2-draw(&MemDC);/畫爆炸CExplosion* explosion; POSITION explosionPos1,explosionPos2; for(explosionPos1 = ListExplosion.GetHeadPosition();explosionPos1!=NULL;)explosionPos2=explosionPos1;explosion = (CExplosion *) ListExplosion.GetNext(explosionPos1); if(explosion-draw(&MemDC)=0)ListExplosion.RemoveAt(explosionPos2);/輸出當(dāng)前信息HFONT font;font=CreateFont(20,10,0,0,0,0,0,0,0,0,0,100,10,0);MemDC.SelectObject(font);CString str;MemDC.SetTextColor(RGB(239,7,7);MemDC.SetBkColor(RGB(0,0,0);str.Format(_T(游戲得分:%d),myscore);MemDC.TextOut(10,10,str);str.Format(_T(剩余生命:%d),lifeNum);MemDC.TextOut(10,30,str);str.Format(_T(當(dāng)前關(guān)卡:%d),passnum);MemDC.TextOut(10,50,str);pDC-BitBlt(rect.left,rect.top,rect.right,rect.bottom,&MemDC,0,0,SRCCOPY);MemBitmap.DeleteObject();MemDC.DeleteDC(); / TODO: 在此處為本機(jī)數(shù)據(jù)添加繪制代碼 void CPLANEGAMEView:OnInitialUpdate()if(AfxMessageBox(L查看游戲說明請點(diǎn)擊“是”,若直接進(jìn)入游戲請點(diǎn)擊“否”!,MB_YESNO)=6)AfxMessageBox(L方向鍵控制戰(zhàn)機(jī)方向,空格鍵射擊,鼠標(biāo)均可控制。初始生命值為,消滅一個敵機(jī)加分,分?jǐn)?shù)達(dá)到即可進(jìn)入下一關(guān)。隨著關(guān)卡增多,敵機(jī)速度增加!);Sleep(1000);CView:OnInitialUpdate();/加載飛機(jī) myplane.load(); GetClientRect(&rect);myplane.setPoint(rect.right/2,rect.bottom/2);/加載敵機(jī)CEnemy:load();/加載飛機(jī)炮彈CBomb:load(); /加載戰(zhàn)機(jī)子彈CBall:load();/加載爆炸CExplosion:load();/設(shè)置定時(shí)器this-SetTimer(1,100,0);/ TODO: 在此添加專用代碼和/或調(diào)用基類 void CPLANEGAMEView:OnTimer(UINT_PTR nIDEvent)/ TODO: 在此添加消息處理程序代碼和/或調(diào)用默認(rèn)值/上下左右鍵控制飛機(jī)移動 GetClientRect(&rect);if (GetKeyState(VK_LEFT)rect.left)myplane.move(1);if (GetKeyState(VK_RIGHT)0)if(myplane.Pos.xrect.right-50)myplane.move(2);if (GetKeyState(VK_UP)rect.top)myplane.move(3);if (GetKeyState(VK_DOWN)0)if(myplane.Pos.yrect.bottom-50)myplane.move(4);if (GetKeyState(VK_SPACE)0)/空格鍵代表戰(zhàn)機(jī)發(fā)射子彈CBomb *Bomb1=new CBomb( myplane.getPoint().x, myplane.getPoint().y); ListBomb1.AddHead(Bomb1);CBomb *Bomb2=new CBomb( myplane.getPoint().x+35, myplane.getPoint().y);ListBomb2.AddHead(Bomb2);PlaySound(LPCTSTR)IDR_WAVE4, AfxGetInstanceHandle(), SND_RESOURCE |SND_ASYNC);if (GetKeyState(F)0)KillTimer(1);if(GetKeyState(J)setSpeed(30);if (BombOne-Pos.yrect.top)BombOne-move();elseListBomb1.RemoveAt(p1);/第二排戰(zhàn)機(jī)炮彈POSITION pos2,p2;CBomb *BombTwo;for(pos2=ListBomb2.GetHeadPosition();pos2!=NULL;)p2=pos2;BombTwo=(CBomb*)ListBomb2.GetNext(pos2);BombTwo-setSpeed(30);if (BombTwo-Pos.yrect.top)BombTwo-move();else ListBomb2.RemoveAt(p2);switch(nIDEvent) case 1:/向下飛的敵機(jī) POSITION pos1,p1; CEnemy *enemy1=new CEnemy(1); if(ListEnemy1.GetCount()setSpeed(enemyspeed);if(enemyone-Pos.ymove(1);elseListEnemy1.RemoveAt(p1);/向下飛的飛機(jī)的子彈POSITION posball1,pball1;CBall * ball1=new CBall(enemyone-getPoint().x+12,enemyone-getPoint().y+20,1);if (ListBall1.GetCount()setSpeed(ballspeed);if(ballone-getPoint().ymove(1);elseListBall1.RemoveAt(pball1); /向上飛的敵機(jī)this-GetClientRect(&rect);POSITION pos2,p2;CEnemy *enemy2=new CEnemy(-1);enemy2-setPoint(rand()%1000,rect.bottom-35);if(ListEnemy2.GetCount()setSpeed(enemyspeed); if (enemytwo-Pos.yrect.top) enemytwo-move(-1);elseListEnemy2.RemoveAt(p2);/向上飛的敵機(jī)的子彈POSITION posball2,pball2;CBall * ball2=new CBall(enemytwo-getPoint().x+12,enemytwo-getPoint().y+20,1);if (ListBall2.GetCount()setSpeed(ballspeed);if(balltwo-getPoint().yrect.top)balltwo-move(-1);elseListBall2.RemoveAt(pball2); this-Invalidate(TRUE);break;/戰(zhàn)機(jī)炮彈打中敵機(jī)/ /聲明戰(zhàn)機(jī)子彈位置,敵機(jī)位置POSITION bombPos,bombTemp,enemyPos,enemyTemp;for(bombPos= ListBomb1.GetHeadPosition();(bombTemp=bombPos)!=NULL;)bomb = (CBomb *) ListBomb1.GetNext(bombPos);/獲得戰(zhàn)機(jī)子彈的矩形區(qū)域CRect bombRect = bomb-getRect(); /消滅從上往下飛的敵機(jī)for(enemyPos= ListEnemy1.GetHeadPosition();(enemyTemp=enemyPos)!=NULL;)enemy = (CEnemy *) ListEnemy1.GetNext(enemyPos);/獲得敵機(jī)的矩形區(qū)域CRect enemyRect = enemy-getRect();/判斷兩個矩形區(qū)域是否有交接CRect tempRect;if(tempRect.IntersectRect(&bombRect,enemyRect)/將爆炸對象添加到爆炸鏈表中CExplosion *explosion=new CExplosion( enemy-getPoint().x+12),( enemy-getPoint().y+17);ListExplosion.AddTail(explosion);PlaySound(LPCTSTR)IDR_WAVE2, AfxGetInstanceHandle(), SND_RESOURCE |SND_ASYNC);/爆炸后刪除子彈ListBomb1.RemoveAt(bombTemp);delete bomb;/刪除敵機(jī)ListEnemy1.RemoveAt(enemyTemp);delete enemy;myscore+;/消滅從下往上飛的敵機(jī)for(enemyPos= ListEnemy2.GetHeadPosition();(enemyTemp=enemyPos)!=NULL;)enemy = (CEnemy *) ListEnemy2.GetNext(enemyPos);/獲得敵機(jī)的矩形區(qū)域CRect enemyRect = enemy-getRect();/判斷兩個矩形區(qū)域是否有交接CRect tempRect;if(tempRect.IntersectRect(&bombRect,enemyRect)/將爆炸對象添加到爆炸鏈表中CExplosion *explosion=new CExplosion( enemy-getPoint().x+12),( enemy-getPoint().y+17);ListExplosion.AddTail(explosion);PlaySound(LPCTSTR)IDR_WAVE2, AfxGetInstanceHandle(), SND_RESOURCE |SND_ASYNC);/爆炸后刪除子彈ListBomb1.RemoveAt(bombTemp);delete bomb;/刪除敵機(jī)ListEnemy2.RemoveAt(enemyTemp);delete enemy;myscore+; /敵機(jī)子彈打中戰(zhàn)機(jī)/聲明敵機(jī)炸彈位置坐標(biāo),戰(zhàn)機(jī)位置myPlanePosPOSITION ballPos,ballTemp;/從上往下飛的敵機(jī)子彈打中戰(zhàn)機(jī)for(ballPos= ListBall1.GetHeadPosition();(ballTemp=ballPos)!=NULL;)ball = (CBall *) ListBall1.GetNext(ballPos);/獲得敵機(jī)炸彈的矩形區(qū)域CRect ballRect = ball-getRect();/獲得戰(zhàn)機(jī)的矩形區(qū)域CRect myPlaneRect = myplane.getRect(); /判斷兩個矩形區(qū)域是否有交接CRect tempRect;/如果敵機(jī)炸彈打中戰(zhàn)機(jī),則使戰(zhàn)機(jī)爆炸if(tempRect.IntersectRect(&ballRect,myPlaneRect) /將爆炸對象加入爆炸鏈表中CExplosion *explosion = new CExplosion( myplane.getPoint()

溫馨提示

  • 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

提交評論