飛機(jī)大戰(zhàn)實(shí)訓(xùn)報(bào)告(共24頁)_第1頁
飛機(jī)大戰(zhàn)實(shí)訓(xùn)報(bào)告(共24頁)_第2頁
飛機(jī)大戰(zhàn)實(shí)訓(xùn)報(bào)告(共24頁)_第3頁
飛機(jī)大戰(zhàn)實(shí)訓(xùn)報(bào)告(共24頁)_第4頁
飛機(jī)大戰(zhàn)實(shí)訓(xùn)報(bào)告(共24頁)_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上程序設(shè)計(jì)綜合實(shí)踐實(shí)習(xí)報(bào)告學(xué)院名稱信息科學(xué)與工程學(xué)院專業(yè)班級(jí)軟件工程2012-3學(xué)生姓名程大川學(xué)號(hào)2指導(dǎo)教師孫紅梅山 東 科 技 大 學(xué)一、實(shí)習(xí)題目: 飛機(jī)大戰(zhàn)游戲的設(shè)計(jì)與實(shí)現(xiàn) 二、實(shí)習(xí)時(shí)間:7周 8周 實(shí)習(xí)地點(diǎn):J13-128 三、實(shí)習(xí)任務(wù): 1基本功能要求:飛機(jī)大戰(zhàn)游戲必須運(yùn)用透明貼圖、按鍵處理、定時(shí)控制、雙緩沖技術(shù)等技術(shù)實(shí)現(xiàn)戰(zhàn)機(jī)(玩家)和敵機(jī)(計(jì)算機(jī))對(duì)戰(zhàn)功能 2擴(kuò)展功能:在完成基本功能基礎(chǔ)上可以增加雙人對(duì)戰(zhàn)、游戲積分制、聲音效果、多種子彈類型、客機(jī)類型、游戲關(guān)卡設(shè)計(jì)、多種類型敵機(jī)、游戲中間結(jié)果存貯等功能 四、小組分工說明:此次實(shí)習(xí)項(xiàng)目,所有內(nèi)容均由一人完成 五、

2、實(shí)習(xí)成績 六、指導(dǎo)教師對(duì)實(shí)習(xí)的評(píng)語: 指導(dǎo)教師(簽章): 2014年 月 日目 錄專心-專注-專業(yè)1. 概述1.1實(shí)訓(xùn)概述這次實(shí)訓(xùn),目的以Window7 + VS 2013為環(huán)境,編寫一個(gè)簡單的飛機(jī)大戰(zhàn)游戲,熟悉軟件工程的思想,學(xué)習(xí)MFC編程的方法,加深對(duì)面向?qū)ο笏枷氲睦斫?.2功能概述用戶可以左右移動(dòng)控制戰(zhàn)機(jī)和發(fā)射子彈,子彈命中敵機(jī)會(huì)造成傷害,敵機(jī)被擊毀可以獲得積分,積分達(dá)到一定程度會(huì)出現(xiàn)BOSS,BOSS被擊殺后即可進(jìn)行下一關(guān)。游戲中會(huì)不定期出現(xiàn)道具包,吃取不同的道具包會(huì)有不同的增益效果。2. 相關(guān)技術(shù)本項(xiàng)目涉及的幾個(gè)主要技術(shù)介紹和簡要實(shí)現(xiàn)方式如下:2.1滾動(dòng)背景技術(shù)為了讓游戲場景更加逼真

3、,游戲節(jié)奏更加合理,可以通過讓背景滾動(dòng)來提高游戲的場景效應(yīng),實(shí)現(xiàn)這一技術(shù)時(shí),可以將一張背景圖片復(fù)制為三張,從上到下連續(xù)的拼接在一起,并將中間的圖片進(jìn)行垂直翻轉(zhuǎn),在輸出圖像時(shí),每次只輸出合成后圖片的1/3部分,每次輸出后,將位圖中的縱坐標(biāo)輸出位置增加一個(gè)位移量,當(dāng)輸出位置到達(dá)圖片的2/3部分時(shí),將圖片的縱坐標(biāo)輸出位置置為0,由于圖片的起始位置和圖片的2/3位置是一致,所以在背景圖片的顯示中,不會(huì)出現(xiàn)圖片的卡頓和瞬移現(xiàn)象。2.2透明貼圖技術(shù)在飛機(jī)大戰(zhàn)項(xiàng)目中,需要將很多的BMP圖像貼到畫布上,結(jié)合邏輯處理完成對(duì)整個(gè)游戲的設(shè)計(jì),為了實(shí)現(xiàn)更好的顯示效果,使移動(dòng)元素所用的圖像更加貼合背景,則需要利用透明貼

4、圖技術(shù),將BMP圖像中的無關(guān)顏色做透明處理,實(shí)現(xiàn)方式為調(diào)用CDC中的TransparentBlt函數(shù),并且利用函數(shù)的最后一個(gè)參數(shù)填寫RGB信息,實(shí)現(xiàn)對(duì)對(duì)應(yīng)顏色的透明化。2.3定時(shí)器技術(shù)為了實(shí)現(xiàn)屏幕的定時(shí)刷新功能和暫停功能,需要設(shè)置定時(shí)器,當(dāng)設(shè)置好時(shí)間間隔時(shí),每次經(jīng)過一個(gè)設(shè)置的時(shí)間間隔,Windows都會(huì)向程序發(fā)送一個(gè)WM_TIMER,并且調(diào)用相關(guān)函數(shù),程序執(zhí)行OnTimer函數(shù),并根據(jù)定時(shí)器編號(hào)執(zhí)行相應(yīng)的操作。實(shí)現(xiàn)方式為使用SetTimer函數(shù)設(shè)置定時(shí)器標(biāo)識(shí)和時(shí)間間隔。另外也可以利用定時(shí)器實(shí)現(xiàn)對(duì)連續(xù)按鍵的處理,使子彈發(fā)射和移動(dòng)效果更加平滑合理。2.4雙緩沖技術(shù)利用普通的繪制函數(shù)對(duì)項(xiàng)目中元素進(jìn)行

5、繪圖時(shí),由于繪圖時(shí)機(jī)不一定連續(xù),繪圖效率不一定統(tǒng)一,會(huì)造成重影和閃屏的不良效果,為了解決這一問題,可以利用雙緩沖技術(shù),先將要繪制的每部分內(nèi)容存儲(chǔ)到內(nèi)存中的一個(gè)虛擬的繪圖設(shè)備中,當(dāng)所有部分的內(nèi)容都繪制完畢后,再一次性的將內(nèi)存中的內(nèi)容繪制到真實(shí)屏幕上,實(shí)現(xiàn)這一方式,可以在程序定義一個(gè)CDC指針變量和CBitmap指針向量實(shí)現(xiàn),在構(gòu)造函數(shù)中為兩個(gè)指針分配內(nèi)存空間,將所有的圖像繪制完畢后,再利用GetDC函數(shù)取得真實(shí)窗口CDC指針和BitBlt函數(shù)將內(nèi)存中的內(nèi)容完整的拷貝至真實(shí)屏幕上。2.5連續(xù)按鍵處理技術(shù)在飛機(jī)大戰(zhàn)項(xiàng)目中,需要根據(jù)鍵盤輸入決定游戲中各種位置的改變和一些變量的內(nèi)容,在利用戰(zhàn)機(jī)發(fā)射子彈或

6、者進(jìn)行移動(dòng)時(shí),需要按下鍵盤的空格鍵或者方向鍵,在該項(xiàng)目中,如果利用MFC中提供的默認(rèn)消息處理函數(shù)進(jìn)行按鍵消息的處理,則會(huì)導(dǎo)致子彈發(fā)射頻率過快,戰(zhàn)機(jī)移動(dòng)過快,甚至程序卡死等嚴(yán)重問題,所以應(yīng)將按鍵消息處理放在OnTimer函數(shù)里,以達(dá)到平滑的移動(dòng)和發(fā)射子彈效果2.6碰撞處理技術(shù)在該項(xiàng)目中,需要處理對(duì)象之間的各種碰撞,比如,戰(zhàn)機(jī)子彈與敵機(jī)的碰撞、敵機(jī)子彈與戰(zhàn)機(jī)的碰撞、敵機(jī)與戰(zhàn)機(jī)的碰撞、子彈與客機(jī)的碰撞等等。在處理碰撞時(shí),可以為每個(gè)對(duì)象設(shè)置一個(gè)與位圖大小相同的矩形,矩形的位置與對(duì)應(yīng)位圖所在位置一直,當(dāng)判斷兩個(gè)元素是否發(fā)生了碰撞時(shí),只需要利用IntersectRect函數(shù)判斷兩個(gè)矩形是否相交即可。2.7

7、鏈表存儲(chǔ)技術(shù)一局游戲中會(huì)有很多的敵機(jī),敵機(jī)子彈以及戰(zhàn)機(jī)子彈,并且需要其進(jìn)行添加、刪除、遍歷等操作,為了提高程序執(zhí)行效率,選用鏈表存儲(chǔ)這些類型,當(dāng)需要生產(chǎn)一個(gè)敵機(jī)或者敵機(jī)子彈時(shí),只需要在鏈表尾部添加一個(gè)對(duì)應(yīng)的對(duì)象即可,時(shí)間復(fù)雜度為O(1),當(dāng)敵機(jī)被擊毀或者子彈失效時(shí),只需要在鏈表中將對(duì)應(yīng)位置的對(duì)象刪除即可,時(shí)間復(fù)雜度為O(1),當(dāng)繪圖時(shí),需要對(duì)所有的對(duì)象進(jìn)行遍歷,此時(shí)只需要從頭至尾遍歷一個(gè)鏈表即可,時(shí)間復(fù)雜度為O(n),所有的復(fù)雜度已經(jīng)是最低,所以利用CList鏈表存儲(chǔ)項(xiàng)目各種對(duì)象,是一個(gè)非常合理的選擇。2.8動(dòng)態(tài)效果技術(shù)在敵機(jī)被擊毀時(shí),需要顯示敵機(jī)爆炸的畫面,這個(gè)動(dòng)態(tài)的畫面是由一組靜態(tài)圖像連續(xù)

8、繪制形成的,為了實(shí)現(xiàn)這一效果,可以利用MFC中的CImageList類,將一組由靜態(tài)圖像組成的連續(xù)位圖按照一定格式轉(zhuǎn)化為CImageList對(duì)象,并為每個(gè)對(duì)象設(shè)置一個(gè)index,在敵機(jī)生命值為0時(shí),根據(jù)index逐幀播放圖像,實(shí)現(xiàn)敵機(jī)爆炸的動(dòng)態(tài)效果。3.需求分析3.1功能需求分析l 飛機(jī)大戰(zhàn)項(xiàng)目需要實(shí)現(xiàn)的主要功能如下:l 戰(zhàn)機(jī)在用戶的控制下可以自由移動(dòng),但不可以移動(dòng)到窗體外。l 戰(zhàn)機(jī)可以連續(xù)發(fā)射子彈,子彈的起始位置和戰(zhàn)機(jī)位置有關(guān)。l 敵機(jī)在窗口頂部隨機(jī)產(chǎn)生,產(chǎn)生后垂直向下移動(dòng)。l 敵機(jī)可以發(fā)射子彈,每個(gè)敵機(jī)在一個(gè)發(fā)射時(shí)刻可以發(fā)射兩枚子彈。l 客機(jī)在窗口頂部隨機(jī)產(chǎn)生,產(chǎn)生后由極慢的速度向下移動(dòng)。

9、l 客機(jī)的大小十分龐大,遠(yuǎn)大于敵機(jī)和戰(zhàn)機(jī)l 戰(zhàn)機(jī)子彈由戰(zhàn)機(jī)產(chǎn)生,垂直向上飛行,并且可以擊中敵機(jī)和客機(jī)l 敵機(jī)子彈由敵機(jī)產(chǎn)生,垂直向下飛行,并且可以擊中戰(zhàn)機(jī)和客機(jī)l 游戲中會(huì)不定期出現(xiàn)道具包,飛機(jī)經(jīng)過道具包會(huì)出現(xiàn)不同的效果l 擊毀敵機(jī)可以獲得一定的得分,得分到達(dá)一定數(shù)量會(huì)出現(xiàn)BOSSl BOSS產(chǎn)生于頂部,不會(huì)向下移動(dòng),會(huì)被子彈擊中,擊毀后可通過關(guān)卡。l 通過關(guān)卡后會(huì)使游戲難度增加,通過所有關(guān)卡會(huì)通關(guān),完成游戲。3.2數(shù)據(jù)需求分析飛機(jī)大戰(zhàn)項(xiàng)目中所需要的數(shù)據(jù)有類型數(shù)據(jù)戰(zhàn)機(jī)戰(zhàn)機(jī)位置,戰(zhàn)機(jī)生命值,戰(zhàn)機(jī)傷害值敵機(jī)敵機(jī)位置,敵機(jī)生命值,敵機(jī)傷害值,敵機(jī)的生成速度,敵機(jī)的移動(dòng)速度戰(zhàn)機(jī)子彈子彈位置,子彈發(fā)射相

10、應(yīng)速度,子彈移動(dòng)速度,子彈傷害值敵機(jī)子彈子彈位置,子彈發(fā)射生成速度,子彈移動(dòng)速度,子彈傷害值道具包道具包類型,道具包位置,道具包移動(dòng)速度BOSSBOSS位置,BOSS傷害,BOSS生命值關(guān)卡關(guān)卡編號(hào),關(guān)卡難度,得分3.3行為需求分析飛機(jī)大戰(zhàn)項(xiàng)目中的行為可以用下面的用例圖表示3.4其他需求背景可以滾動(dòng)4. 總體設(shè)計(jì)與詳細(xì)設(shè)計(jì)(介紹游戲的功能模塊劃分,主要類圖、狀態(tài)圖、活動(dòng)圖或順序圖)4.1 系統(tǒng)模塊劃分4.2 主要功能模塊4.2.1玩家控制模塊設(shè)計(jì)圖4.2.2游戲邏輯模塊設(shè)計(jì)圖(包含關(guān)卡控制)4.2.3 圖形顯示模塊設(shè)計(jì)(包含敵方生成模塊)4.3 主要類圖4.4 軟件結(jié)構(gòu)設(shè)計(jì)體會(huì)軟件結(jié)構(gòu)設(shè)計(jì)部分

11、是軟件工程開發(fā)過程的重要部分,設(shè)計(jì)內(nèi)容的好壞關(guān)系到整個(gè)軟件的優(yōu)劣,在這次飛機(jī)大戰(zhàn)項(xiàng)目開發(fā)中,對(duì)結(jié)構(gòu)設(shè)計(jì)中出現(xiàn)的種種問題以及解決方法,加深了對(duì)軟件結(jié)構(gòu)設(shè)計(jì)方法的理解,熟悉了對(duì)其的應(yīng)用,從系統(tǒng)功能模塊設(shè)計(jì)到主要功能設(shè)計(jì),從類圖到狀態(tài)圖,都是著軟件開發(fā)的每一個(gè)步驟,從宏觀和細(xì)節(jié)處展示了整個(gè)軟件的體系結(jié)構(gòu),使整個(gè)軟件更有層次感。5. 編碼實(shí)現(xiàn)5.1編碼規(guī)范l 在這次飛機(jī)大戰(zhàn)設(shè)計(jì)開發(fā)項(xiàng)目中,涉及到的編碼規(guī)范主要包括l 類、對(duì)象、變量、常量、函數(shù)的名稱含義準(zhǔn)確不臃腫l 類的命名必須以C開頭。l 類的名稱中的單詞首字母大寫。l 變量名稱中的單詞首字母大寫。l 函數(shù)名稱中的單詞首字母大寫l 對(duì)象、變量、常量的

12、定義盡量定義在CPaperPlaneDoc里。l 函數(shù)定義在CPaperPlaneView里。l 對(duì)不易理解的部分進(jìn)行注釋5.2代碼組織策略以MFC代碼標(biāo)準(zhǔn)組織方式為主。5.3關(guān)鍵技術(shù)代碼實(shí)現(xiàn)5.3.1雙緩沖的實(shí)現(xiàn)CDC* pMemDC;CBitmap* pBitmap;CPaperPlaneView:CPaperPlaneView()/ TODO: 在此處添加構(gòu)造代碼pMemDC = new CDC();pBitmap = new CBitmap();DrawBG(pMemDC);pDC->BitBlt(0, 0, 600, 600, pMemDC, 0, 0, SRCCOPY); C

13、PaperPlaneView:CPaperPlaneView()delete pMemDC;delete pBitmap;5.3.2透明貼圖的實(shí)現(xiàn)void CCloud:draw(CDC* pDC)CDC memDC;memDC.CreateCompatibleDC(pDC);CBitmap bmpDraw;bmpDraw.LoadBitmap(CloudBitmapNum);memDC.SelectObject(&bmpDraw);pDC->TransparentBlt(pos.x, pos.y, 80,50, &memDC, 0, 0, 80,50, RGB(255,

14、 255, 255);5.3.3滾動(dòng)背景的實(shí)現(xiàn)DrawBG(pMemDC);void CPaperPlaneView:DrawBG(CDC* pDC)CPaperPlaneDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);if (!pDoc)return;/*/CBitmap bitmap;bitmap.LoadBitmap(pDoc->BackGroundNum);BITMAP BitMap;bitmap.GetBitmap(&BitMap);CDC dcMem;dcMem.CreateCompatibleDC(pDC);dcMem.Se

15、lectObject(&bitmap);pDC->StretchBlt(0, 0, 600, 600, &dcMem, 0, pDoc->BGposY, 600, 600, SRCCOPY);pDoc->BGposY -= 10;if (pDoc->BGposY<0)pDoc->BGposY = 1200;5.3.4主要游戲邏輯void CPaperPlaneView:OnTimer(UINT_PTR nIDEvent)/ TODO: 在此添加消息處理程序代碼和/或調(diào)用默認(rèn)值CPaperPlaneDoc* pDoc = GetDocument

16、();ASSERT_VALID(pDoc);if (!pDoc)return;CDC* pDC = GetDC();switch (nIDEvent)case 1:DrawBG(pMemDC);CloudInPlane(pDoc->myPlane,pDoc->enemy);FireInCloud(pDoc->FireList,pDoc->enemy);WaterInPlane(pDoc->WaterList, pDoc->myPlane);PackageInPlane(pDoc->package, pDoc->myPlane);FireInBus

17、iness(pDoc->FireList, pDoc->business);DrawFire(pDoc->FireList);DrawCloud(pDoc->enemy);DrawWater(pDoc->WaterList);pDoc->myPlane.Draw(pMemDC);pDoc->package.Draw(pMemDC);pDoc->business.Draw(pMemDC);DrawTitle();if (pDoc->PlaneScore >= pDoc->PassBase*100*(3*pDoc->NowLe

18、vel-2)+300)KillTimer(1);if (pDoc->NowLevel<2)AfxMessageBox(L"恭喜你通過關(guān)卡,點(diǎn)擊確定進(jìn)入下一關(guān)", MB_OK);SetLevel(+pDoc->NowLevel);if (pDoc->NowLevel<=2)SetTimer(1, 25, 0);else if (pDoc->PlaneScore >= pDoc->PassBase *100* (3 * pDoc->NowLevel - 2) - 300 && pDoc->PlaneSc

19、ore<pDoc->PassBase * 100*(3 * pDoc->NowLevel - 2)if (pDoc->boss.pos.y = -200)killAllEnemy();FireInBoss(pDoc->FireList, pDoc->boss);pDoc->boss.Draw(pMemDC);else if (pDoc->PlaneScore = pDoc->PassBase * 100*(3 * pDoc->NowLevel - 2)if (pDoc->boss.pos.y <= -200)pDoc-&g

20、t;PlaneScore = pDoc->PassBase * 100 * (3 * pDoc->NowLevel - 2) + 1000;pDoc->boss.DrawUp(pMemDC);if (pDoc->myPlane.life <= 0)KillTimer(1);if (AfxMessageBox(L"你輸了,是否重新游戲", MB_YESNO) = 6)pDoc->PlaneScore = 0;SetLevel(pDoc->NowLevel=1);SetTimer(1,25,0);else exit(1);/GetKey

21、Command();if (GetAsyncKeyState('P')KillTimer(1);SetTimer(2,300, 0);if (GetAsyncKeyState(VK_UP)pDoc->myPlane.up();if (GetAsyncKeyState(VK_DOWN)pDoc->myPlane.down();if (GetAsyncKeyState(VK_LEFT) pDoc->myPlane.left();if (GetAsyncKeyState(VK_RIGHT) pDoc->myPlane.right();pDoc->Time

22、rCnt+;if (pDoc->TimerCnt % (40 / CFire:FireMakeSpeed) < 1)if (GetAsyncKeyState(' ')pDoc->FireList.AddTail(CFire(pDoc->myPlane.pos + CPoint(25, -20);if (pDoc->TimerCnt % (40 / CCloud:CloudMakeSpeed) < 1)if(pDoc->boss.pos.y <= -200)pDoc->enemy.AddTail(CCloud();rain(p

23、Doc->enemy, pDoc->WaterList);if (pDoc->TimerCnt>400&&pDoc->TimerCnt % (800 / CPackage:PackageMakeSpeed) < 1)pDoc->package.pos.y = 0;pDoc->package.PackType = rand() % 3 + 1;if (pDoc->havePower > 0 && pDoc->TimerCnt - pDoc->havePower > 300)CFire:F

24、ireMakeSpeed = 6;if (pDoc->boss.pos.y > -200 && pDoc->TimerCnt % (40 / 1) < 1)int base = rand() % 200;for (int i = 0; i < 10; i+)pDoc->WaterList.AddTail(CWater(CPoint(base+i * 20, 200);for (int i = 0; i < 10; i+)pDoc->WaterList.AddTail(CWater(CPoint(base + 300 + i * 2

25、0, 200);if (pDoc->TimerCnt % 4000 < 1)pDoc->business.pos.x = rand() % 450;pDoc->business.pos.y = 0;break;case 2:CBitmap bitmap;bitmap.LoadBitmap(IDB_PAUSE);BITMAP BitMap;bitmap.GetBitmap(&BitMap);CDC dcMem;dcMem.CreateCompatibleDC(pMemDC);dcMem.SelectObject(&bitmap);pMemDC->St

26、retchBlt(0, 0, 600, 600, &dcMem, 0, 0, 600, 600, SRCCOPY);if (GetAsyncKeyState('P')KillTimer(2);SetTimer(1,25,0);if (GetAsyncKeyState('Q')KillTimer(2);SetLevel(pDoc->NowLevel = 1);SetTimer(1, 25, 0);if (GetAsyncKeyState('E')KillTimer(2);if (AfxMessageBox(L"確定退出游戲?

27、", MB_YESNO) = 6)exit(1);elseSetTimer(2,300, 0);pDC->BitBlt(0, 0, 600, 600, pMemDC, 0, 0, SRCCOPY);ReleaseDC(pDC);CView:OnTimer(nIDEvent);5.3.5碰撞判斷int CPaperPlaneView:FireInCloud(CList<CFire>& list, CList<CCloud>& enemy)CPaperPlaneDoc* pDoc = GetDocument();ASSERT_VALID(pD

28、oc);if (!pDoc)return 0;POSITION pos = enemy.GetHeadPosition();while (pos != NULL)pDoc->PlaneScore+=enemy.GetNext(pos).beFired(list);return 0;void CPaperPlaneView:FireInBoss(CList<CFire>& list, CBoss& boss)CPaperPlaneDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);if (!pDoc)return ;boss

29、.beFired(list);if (boss.life <= 0)pDoc->PlaneScore = pDoc->PassBase * 100 * (3 * pDoc->NowLevel - 2);return ;int CPaperPlaneView:WaterInPlane(CList<CWater>& list,CPlane& plane)POSITION ps2,pos = list.GetHeadPosition();while (pos != NULL)ps2 = pos;if (plane.beWatered(list.Ge

30、tNext(pos)list.RemoveAt(ps2);return 0;int CPaperPlaneView:CloudInPlane(CPlane& plane, CList<CCloud>& enemy)POSITION pos = enemy.GetHeadPosition();while (pos != NULL)CCloud& tmp = enemy.GetNext(pos);CRect planeRect1, planeRect2, cloudRect, temRect;planeRect1.SetRect(plane.pos + CPoi

31、nt(10, 10), plane.pos + CPoint(60, 30);planeRect2.SetRect(plane.pos + CPoint(0, 30), plane.pos + CPoint(70, 80);cloudRect.SetRect(tmp.pos, tmp.pos + CPoint(80, 50);if (plane.life>0 &&tmp.life>0&& (temRect.IntersectRect(cloudRect, planeRect1) | temRect.IntersectRect(cloudRect, p

32、laneRect2) plane.life -= tmp.damage;tmp.life -= plane.damage;return 1;return 0;5.3.6 鏈表遍歷int CPaperPlaneView:FireInCloud(CList<CFire>& list, CList<CCloud>& enemy)CPaperPlaneDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);if (!pDoc)return 0;POSITION pos = enemy.GetHeadPosition();whil

33、e (pos != NULL)pDoc->PlaneScore+=enemy.GetNext(pos).beFired(list);return 0;5.3.7 關(guān)卡設(shè)置void CPaperPlaneView:SetLevel(int nLevel)CPaperPlaneDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);if (!pDoc) return;switch (nLevel)case 1:CPlane:PlaneLife = 6;CPlane:PlaneDamage = 1;CPlane:PlaneBitmapNum = IDB_PLA

34、NE1;CCloud:CloudBitmapNum = IDB_CLOUD1;CCloud:CloudBoommapNum = IDB_CLOUDBOOM1;CCloud:CloudLife = 1;CCloud:CloudDamage = 1;CCloud:CloudMakeSpeed = 1;CCloud:CloudMoveSpeed = 2;CFire:FireMakeSpeed = 6; /1 - 9CFire:FireMoveSpeed = 15;CFire:FireDamage = 1;CFire:FireBitmapNum = IDB_FIRE1;CWater:WaterMake

35、Possible = 40;CWater:WaterMoveSpeed = 4;CWater:WaterDamage = 1;CWater:WaterBitmapNum = IDB_WATER1;CPackage:PackageMakeSpeed = 3;/every 20sCPackage:PackageMoveSpeed = 2;CBoss:BossBitmapNum = IDB_BOSS1;pDoc->PassBase = 10;pDoc->PlaneScore = 0;pDoc->boss.pos.y = - 200;pDoc->TimerCnt = 0;pDo

36、c->BGposY = 0;pDoc->WaterList.RemoveAll();pDoc->enemy.RemoveAll();pDoc->FireList.RemoveAll();pDoc->myPlane.init();pDoc->NowLevel = 1; pDoc->havePower = 0;pDoc->package.PackType = rand() % 3 + 1;pDoc->BackGroundNum = IDB_BACKGROUND1;pDoc->boss.life = 10;break;case 2:CPla

37、ne:PlaneLife = 6;CPlane:PlaneDamage = 1;CPlane:PlaneBitmapNum = IDB_PLANE2;CCloud:CloudBitmapNum = IDB_CLOUD2;CCloud:CloudBoommapNum = IDB_CLOUDBOOM1;CCloud:CloudLife = 2;CCloud:CloudDamage = 1;CCloud:CloudMakeSpeed = 1;CCloud:CloudMoveSpeed = 2;CFire:FireMakeSpeed = 6; /1 - 40CFire:FireMoveSpeed =

38、15;CFire:FireDamage = 1;CFire:FireBitmapNum = IDB_FIRE2;CWater:WaterMakePossible = 60;CWater:WaterMoveSpeed = 3;CWater:WaterDamage = 1;CWater:WaterBitmapNum = IDB_WATER2;CPackage:PackageMakeSpeed = 3;/every 20sCPackage:PackageMoveSpeed = 2;CBoss:BossBitmapNum = IDB_BOSS1;pDoc->TimerCnt = 0;pDoc-&

39、gt;PassBase = 10;pDoc->BGposY = 0;pDoc->WaterList.RemoveAll();pDoc->enemy.RemoveAll();pDoc->FireList.RemoveAll();pDoc->myPlane.init();pDoc->havePower = 0;pDoc->package.PackType = rand() % 3 + 1;pDoc->BackGroundNum = IDB_BACKGROUND2; pDoc->NowLevel = 2;pDoc->boss.pos.y =

40、 -200;pDoc->boss.life = 3;break;default:KillTimer(1);AfxMessageBox(L"恭喜你,通關(guān)了!", MB_OK);SetTimer(2,300, 0);break;5.3.8 子彈生成void CPaperPlaneView:rain(CList<CCloud>& enemy, CList<CWater>& list)POSITION pos = enemy.GetHeadPosition();POSITION ps2;while (pos != NULL)ps2 = pos;CCloud& tmp = enemy.GetNext(pos);if (tmp.pos.y > 600)enemy.RemoveAt(ps2);elseif (rand() % 100 < CWater:WaterMakePossible)tmp.rain(list);void CCloud:rain(CList<C

溫馨提示

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

評(píng)論

0/150

提交評(píng)論