飛機(jī)大戰(zhàn)游戲設(shè)計(jì)與實(shí)現(xiàn)_第1頁
飛機(jī)大戰(zhàn)游戲設(shè)計(jì)與實(shí)現(xiàn)_第2頁
飛機(jī)大戰(zhàn)游戲設(shè)計(jì)與實(shí)現(xiàn)_第3頁
飛機(jī)大戰(zhàn)游戲設(shè)計(jì)與實(shí)現(xiàn)_第4頁
飛機(jī)大戰(zhàn)游戲設(shè)計(jì)與實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、SHANDONG UNIVERSITY OF SCIENCE AND TECHNOLOGY程序設(shè)計(jì)綜合實(shí)踐報(bào)告姓名學(xué)號班級項(xiàng)目名稱飛機(jī)大戰(zhàn)游戲設(shè)計(jì)與實(shí)現(xiàn)實(shí)習(xí)地點(diǎn)計(jì)算機(jī)實(shí)驗(yàn)室實(shí)習(xí)時(shí)間2015-12-9 至 2015-12-19實(shí)習(xí)成績指導(dǎo)教師簽字信息科學(xué)與工程學(xué)院2015年12月20日31. 概述 11.1 關(guān)卡設(shè)置 11.2 敵機(jī)設(shè)置 11.3 戰(zhàn)機(jī)設(shè)置 11.4 游戲設(shè)置 12. 相關(guān)技術(shù) 22.1 Windows 定時(shí)器技術(shù) 22.2 雙緩沖技術(shù) 22.3 獲取矩形區(qū)域 23. 總體設(shè)計(jì)與詳細(xì)設(shè)計(jì) 23.1 系統(tǒng)模塊劃分 23.2 主要功能模塊 34. 編碼實(shí)現(xiàn) 44.1 初始準(zhǔn)備 44.

2、2 戰(zhàn)機(jī)對象 64.3 敵機(jī)對象 74.4 道具對象 94.5 主要內(nèi)容 104.6 窗口顯示信息 175. 實(shí)訓(xùn)中遇到的主要問題及解決方法 205.1 產(chǎn)生中斷及解決方案 205.2 圖片閃爍問題及解決方案 206. 實(shí)訓(xùn)體會 201. 概述項(xiàng)目:飛機(jī)大戰(zhàn)主要功能有以下幾點(diǎn):1.1 關(guān)卡設(shè)置本次飛機(jī)大戰(zhàn)游戲中共設(shè)置了四個(gè)關(guān)卡,第一關(guān)的難度設(shè)置較低,僅有敵機(jī)對其進(jìn)行攻擊; 第二關(guān)在原有的基礎(chǔ)上增加一些補(bǔ)血的小道具,當(dāng)積分達(dá)到一定的時(shí)候便會出現(xiàn)該道具,并且敵機(jī)出現(xiàn)的頻率也比第一關(guān)高;第三關(guān)在第二關(guān)的基礎(chǔ)上新出現(xiàn)了小boss,并增加了其他的道具;第四關(guān)在第三關(guān)的基礎(chǔ)上再新出現(xiàn)大boss,當(dāng)積分達(dá)到

3、要求以及大 boss被消滅后通關(guān)成功。1.2 敵機(jī)設(shè)置小敵機(jī)隨機(jī)出現(xiàn),炮彈也隨機(jī)發(fā)射,當(dāng)小敵機(jī)與戰(zhàn)機(jī)相撞或被戰(zhàn)機(jī)的子彈擊中時(shí),小敵機(jī)消失。當(dāng)達(dá)到一定積分時(shí),小boss 出現(xiàn)并隨機(jī)發(fā)射出與小敵機(jī)一樣的炮彈,但是炮彈分三個(gè)方向發(fā)射出。當(dāng)小boss 被戰(zhàn)機(jī)的子彈擊中或與戰(zhàn)機(jī)相撞時(shí)失去5 滴血。當(dāng)?shù)竭_(dá)四關(guān)并且積分足夠多時(shí)出現(xiàn)大 boss ,同小boss 一樣,當(dāng)大boss與戰(zhàn)機(jī)相撞或被戰(zhàn)機(jī)子彈擊中時(shí)失去 1 滴血。 除此之外,小 boss 和大 boss 上方都有血條顯示,當(dāng)血條消失時(shí)意味著生命消失,大 boss 和小 boss 消失。小boss 會在屏幕上隨機(jī)出現(xiàn)和走動出了屏幕后會在屏幕的任意地方再

4、隨機(jī)出現(xiàn),直至血量為0 消失。大boss 則在屏幕中隨機(jī)走動不出屏幕,直至血量為 0 消失。1.3 戰(zhàn)機(jī)設(shè)置戰(zhàn)機(jī)初始有五條生命,每條命的血量為50,所獲得的積分以及其生命值、血條都在窗口的左上角顯示。在第一、二關(guān)時(shí),按空格鍵戰(zhàn)機(jī)會出現(xiàn)兩個(gè)向上發(fā)射的炮彈,到第三、四關(guān)的時(shí)候,按空格鍵戰(zhàn)機(jī)會發(fā)射三個(gè)不同方向的炮彈。戰(zhàn)機(jī)吃到藥瓶道具時(shí)血量會增加20,但不可以超過50;吃到閃電道具時(shí),便可放大招,放大招的次數(shù)為15。當(dāng)戰(zhàn)機(jī)被敵方的炮彈擊中或與敵方相撞時(shí),血量減少,減少為0 時(shí)生命值減1 ,直至生命值為0。1.4 游戲設(shè)置進(jìn)入游戲時(shí),會有背景音樂,窗口左上角顯示戰(zhàn)機(jī)所得積分及其生命值。根據(jù)積分情況進(jìn)入不

5、同的關(guān)卡。游戲通關(guān)時(shí)屏幕清空,并顯示通關(guān)成功,按 Y可重新開始游戲。當(dāng)戰(zhàn)機(jī)的血量以及生命值為 0時(shí),游戲失敗,屏幕清空并顯示游戲結(jié)束,按Y即可重新開始游戲。2. 相關(guān)技術(shù)2.1 Windows定時(shí)器技術(shù)Windows定時(shí)器是一種輸入設(shè)備,它周期性地在每經(jīng)過一個(gè)指定的時(shí)間間隔后就通知應(yīng)用程序一次。程序?qū)r(shí)間間隔告訴windows,然后windows給你的程序發(fā)送周期性發(fā)生的WM_YIME借息以表示時(shí)間到了。本程序在OnCreate()函數(shù)中使用了編號為1的定時(shí)器,控制了每 30 毫秒刷新一次。2.2 雙緩沖技術(shù)在內(nèi)存中創(chuàng)建一個(gè)與屏幕繪圖區(qū)域一致的對象,先將圖形繪制到內(nèi)存這個(gè)對象上,再一次性將這個(gè)

6、對象上的圖形拷貝到屏幕上,這樣即可解決圖片閃爍問題。本程序在繪制滾動背景以及飛機(jī),敵機(jī)等中用到了該技術(shù)。2.3 獲取矩形區(qū)域用 CRect 定義一個(gè)對象,利用這個(gè)對象得到要用到的矩形區(qū)域,用 IntersectRect 函數(shù)來判斷兩個(gè)源矩形是不是有重合的部分。3. 總體設(shè)計(jì)與詳細(xì)設(shè)計(jì)3.1 系統(tǒng)模塊劃分飛機(jī)大戰(zhàn)游戲主要模塊可以說是有幾個(gè)重要的類組成的。首先是老師給出的 CGameObject 類,以及在其派生下的Bomb,Ball,Enemy,MyPlane,Explosion,AddBlood 等等此處不一一列舉。另外還有CObject 派生的 BackGround 類。如下圖:3.2主要功

7、能模塊主要功能是在飛機(jī)大戰(zhàn)View類中,OnTimer函數(shù)中實(shí)現(xiàn),將各個(gè)類調(diào)用,隨機(jī)產(chǎn)生敵機(jī),子彈的輸出,爆炸的實(shí)現(xiàn)等等。它的實(shí)現(xiàn)圖可以如下實(shí)現(xiàn):本程序所包含的功能和類模塊:游戲子系統(tǒng)模塊名稱功能簡述應(yīng)用程序?qū)ο笥螒虺绦虻募虞d、游戲?qū)ο蟮睦L制、玩家的鍵盤事件獲取游戲?qū)ο蟾鱾€(gè)游戲?qū)ο蟮某橄蟾割?CGameObject)戰(zhàn)機(jī)對象戰(zhàn)機(jī)類(MyPlane)敵機(jī)對象敵機(jī)類(Enemy, LittleBoss,Boss)導(dǎo)彈對象導(dǎo)彈類(Bomb, Bomb2)炸彈對象炸彈類(Ball , BossBall)爆炸對象爆炸類(Explosion )道具對象道具類 A AddBlood , AddBomb4.編

8、碼實(shí)現(xiàn)4.1初始準(zhǔn)備模塊名稱應(yīng)用程序?qū)ο蠊δ苊枋鲇螒虺绦虻募虞d、游戲?qū)ο蟮睦L制、玩家的鍵盤事件獲取數(shù)據(jù)結(jié)構(gòu) 與算法CflyfightView:CflyfightView() / TODO:在此處添加構(gòu)造代碼flag=0;flag2=0;level=1;bossb100d=100;CflyfightView:CflyfightView() BOOL CflyfightView:PreCreateWindow(CREATESTRUCT& cs) / TODO:在此處通過修改/ CREATESTRUCT cs來修改窗口類或樣式return CView:PreCreateWindow(cs);

9、/ CflyfightView繪制void CflyfightView:OnDraw(CDC* pDC) CflyfightDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);if (!pDoc) return;/ TODO:在此處為本機(jī)數(shù)據(jù)添加代碼 / CflyfightView打印BOOL CflyfightView:OnPreparePrinting(CPrintInfo* pInfo) /默認(rèn)準(zhǔn)備return DoPreparePrinting(pInfo);void CflyfightView:OnBeginPrinting(CDC* /*pDC

10、*/, CPrintInfo* /*pInfo*/)3/ TODO:添加額外的打印前進(jìn)行的初始化過程 void CflyfightView:OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) / TODO:添加打印后進(jìn)行的清理過程/ CflyfightView 診斷#ifdef _DEBUGvoid CflyfightView:AssertValid() const CView:AssertValid();void CflyfightView:Dump(CDumpContext& dc) constCView:Dump(dc);Cfly

11、fightDoc* CflyfightView:GetDocument() const /非調(diào)試版本是內(nèi)聯(lián)的ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CflyfightDoc); return (CflyfightDoc*)m_pDocument;#endif/_DEBUG/ CflyfightView消息處理程序int CflyfightView:OnCreate(LPCREATESTRUCT lpCreateStruct) if (CView:OnCreate(lpCreateStruct) = -1) return -1;/ TODO:在

12、此添加專用代碼和/或調(diào)用基類PlaySound(LPCTSTR)IDR_WAVE1, AfxGetInstanceHandle(), SND_RESOURCE | SND_ASYNC|SND_LOOP);SetTimer(1,30, 0);CMyPlane:LoadImage();CEnemy:LoadImage();CExplosion:LoadImage();CBomb:LoadImage();CBall:LoadImage();CAddBlood:LoadImage();CAddBomb:LoadImage();CBomb2:LoadImage();CLittleBoss:LoadIma

13、ge();CBoss:LoadImage();CBossBall:LoadImage();return 0;void CflyfightView:OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags) / TODO:在此添加消息處理程序代碼和/或調(diào)用默認(rèn)值if(nChar=VK_DOWN|VK_UP)myPlane.SetVerMotion(0);if(nChar=VK_RIGHT|VK_LEFT)myPlane.SetHorMotion(0);CView:OnKeyUp(nChar, nRepCnt, nFlags);補(bǔ)充說明4.2戰(zhàn)機(jī)對象模塊名稱戰(zhàn)機(jī)對

14、象功能描述:戰(zhàn)機(jī)移動、戰(zhàn)機(jī)導(dǎo)彈的發(fā)射數(shù)據(jù)結(jié)構(gòu) 與算法short key=GetKeyState(VK_RIGHT);short key1=GetKeyState(VK_LEFT);short key2=GetKeyState(VK_UP);short key3=GetKeyState(VK_DOWN);if (key&0x80)!=0)myPlane.SetHorMotion(1);else if (key1&0x80)!=0)myPlane.SetHorMotion(-1);else if (key2&0x80)!=0)myPlane.SetVerMotion(-1)

15、;else if (key3&0x80)!=0)myPlane.SetVerMotion(1);void CflyfightView:OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)/ TODO:在此添加消息處理程序代碼和 /或調(diào)用默認(rèn)值if(nChar=VK_DOWN|VK_UP)myPlane.SetVerMotion(0);if(nChar=VK_RIGHT|VK_LEFT)myPlane.SetHorMotion(0);CView:OnKeyUp(nChar, nRepCnt, nFlags);void CflyfightView:O

16、nKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) / TODO:在此添加消息處理程序代碼和 /或調(diào)用默認(rèn)值 if(nChar=VK_SPACE)if(myPlane.Fired()if(flag=0&&(level=1|level=2)listBomb.AddTail(newCBomb(myPlane.GetPoint().x+10,myPlane.GetPoint().y+20,0,12);listBomb.AddTail(newCBomb(myPlane.GetPoint().x+30,myPlane.GetPoint().y+

17、20,0,12);else if(flag=0&&(level=3|level=4)listBomb.AddTail(newCBomb(myPlane.GetPoint().x+10,myPlane.GetPoint().y+20,5,12);listBomb.AddTail(newCBomb(myPlane.GetPoint().x+30,myPlane.GetPoint().y+20,0,12);listBomb.AddTail(newCBomb(myPlane.GetPoint().x+30,myPlane.GetPoint().y+20,-5,12);if(flag2!

18、=0)listBomb2.AddTail(newCBomb2(myPlane.GetPoint().x+10,myPlane.GetPoint().y+20,10,10);listBomb2.AddTail(newCBomb2(myPlane.GetPoint().x+40,myPlane.GetPoint().y+20,5,10);listBomb2.AddTail(newCBomb2(myPlane.GetPoint().x+20,myPlane.GetPoint().y+20,0,10);listBomb2.AddTail(newCBomb2(myPlane.GetPoint().x+4

19、0,myPlane.GetPoint().y+20,-5,10);listBomb2.AddTail(newCBomb2(myPlane.GetPoint().x+40,myPlane.GetPoint().y+20,-10,10);flag2-;if(flag2<1)flag=0;補(bǔ)充說明4.3 敵機(jī)對象模塊名稱敵機(jī)對象功能描述敵機(jī)、大小boss隨機(jī)產(chǎn)生,隨機(jī)方向發(fā)射子彈, 的血條顯示大boss隨機(jī)發(fā)射子彈,大小boss數(shù)據(jù)結(jié)構(gòu) 與算法/敵機(jī)的隨機(jī)產(chǎn)生if(level=1)if(rand()%30=10)listEnemy.AddTail(new CEnemy(); if(level=

20、2|level=3)if(rand()%25=15)listEnemy.AddTail(new CEnemy();if(level=4)if(rand()%20=15)listEnemy.AddTail(new CEnemy();/大小Boss的隨機(jī)產(chǎn)生if(myPlane.score%600=0&&level!=1&&level!=2)listlboss.AddHead(new CLittleBoss();if(myPlane.score=3630)listboss.AddHead(new CBoss();/敵機(jī)、Boss產(chǎn)生子彈posEnemy=listEn

21、emy.GetHeadPosition();while(posEnemy!=NULL)CEnemy *pEnemy=(CEnemy*)listEnemy.GetNext(posEnemy);CPoint point2=pEnemy->GetPoint();if(rand()%60=1)listBall.AddTail(new CBall(point2.x+10,point2.y+10,0,-12);poslboss=listlboss.GetHeadPosition();while(poslboss!=NULL)CLittleBoss *plboss=(CLittleBoss*)list

22、lboss.GetNext(poslboss);CPoint point3=plboss->GetPoint();if(rand()%50=1)listBall.AddTail(new CBall(point3.x+10,point3.y+10,-5,-12);listBall.AddTail(new CBall(point3.x+10,point3.y+10,0,-12);listBall.AddTail(new CBall(point3.x+10,point3.y+10,5,-12);posboss=listboss.GetHeadPosition(); while(posboss!

23、=NULL)CBoss *pboss=(CBoss*)listboss.GetNext(posboss);CPoint point4=pboss->GetPoint();listbossball.AddTail(newif(rand()%40=1)CBossBall(point4.x+45,point4.y+90,-5,-12);listbossball.AddTail(new CBossBall(point4.x+45,point4.y+90,0,-12);listbossball.AddTail(new CBossBall(point4.x+45,point4.y+10,5,-12)

24、;/大Boss血條顯示CBrush brush;brush.CreateSolidBrush(RGB(255,0,0);pDC->SelectObject(brush);pDC->Rectangle(m_ptPos.x,m_ptPos.y,m_ptPos.x+bblood*0.9,m_ptPos.y-5);/小Boss血條顯示CBrush brush;brush.CreateSolidBrush(RGB(255,0,0);pDC->SelectObject(brush);pDC->Rectangle(m_ptPos.x,m_ptPos.y,m_ptPos.x+lbloo

25、d,m_ptPos.y-5);補(bǔ)充說明4.4 道具對象模塊名稱道具對象功能描述積分達(dá)到一定的時(shí)候出現(xiàn)道具,戰(zhàn)機(jī)吃掉道具,道具消失,戰(zhàn)機(jī)補(bǔ)血或獲得技能數(shù)據(jù)結(jié)構(gòu) 與算法if(myPlane.score%510=0)listAddblood.AddHead(new CAddBlood();if(myPlane.score%900=0&&level!=1)listaddbomb.AddHead(new CAddBomb();/*加血藥瓶 */POSITION posaddblood=listAddblood.GetHeadPosition();POSITION pos4;for(pos

26、addblood;(pos4=posaddblood)!=NULL;)CAddBlood *paddblood=(CAddBlood*)listAddblood.GetNext(posaddblood); paddblood->Draw(&m_mDC,FALSE);CRect rect;int section=rect.IntersectRect(paddblood->GetRect(),myPlane.GetRect(); if(section!=0)if(myPlane.blood<50)myPlane.blood+=20;listAddblood.RemoveA

27、t(pos4);delete paddblood;break;/*技能道具 */POSITION posaddbomb=listaddbomb.GetHeadPosition();POSITION pos5;for(posaddbomb;(pos5=posaddbomb)!=NULL;)CAddBomb* paddbomb=(CAddBomb*)listaddbomb.GetNext(posaddbomb);paddbomb->Draw(&m_mDC,FALSE);CRect rect;int section=rect.IntersectRect(paddbomb->Get

28、Rect(),myPlane.GetRect(); if(section!=0)flag=1;flag2=15;listaddbomb.RemoveAt(pos5);delete paddbomb;break;補(bǔ)充說明4.5 主要內(nèi)容模塊名稱主要內(nèi)容功能描述戰(zhàn)機(jī)導(dǎo)彈擊中敵機(jī)和大小Boss,戰(zhàn)機(jī)與敵機(jī)和大小 Boss相撞,敵機(jī)和大小 Boss發(fā)射的炮彈擊中戰(zhàn)機(jī)數(shù)據(jù)結(jié)構(gòu) 與算法/戰(zhàn)機(jī)導(dǎo)彈擊中敵機(jī)POSITION pos1 = NULL;/ 刪除敵機(jī)POSITION pos2 = NULL,pos3=NULL;/ 刪除導(dǎo)彈for (posBomb = listBomb.GetHeadPosition

29、(); (pos2=posBomb)!= NULL;)CBomb *pBomb = (CBomb*)listBomb.GetNext(posBomb);for (posEnemy = listEnemy.GetHeadPosition(); (pos1=posEnemy ) != NULL;) CRect intersectRect;CEnemy *pEnemy = (CEnemy*)listEnemy.GetNext(posEnemy);int intersectSection = intersectRect.IntersectRect(pEnemy->GetRect(), pBomb

30、->GetRect();if (intersectSection != 0)CRect eRect;eRect=pEnemy->GetRect();listExplosion.AddTail(new CExplosion(eRect.left, eRect.top);myPlane.score+=30;if(myPlane.score%510=0)listAddblood.AddHead(new CAddB100d();if(myPlane.score%900=0&&level!=1)listaddbomb.AddHead(new CAddBomb();if(myP

31、lane.score%600=0&&level!=1&&level!=2)listlboss.AddHead(new CLittleBoss();if(myPlane.score=3630)listboss.AddHead(new CBoss();listEnemy.RemoveAt(pos1);listBomb.RemoveAt(pos2);delete pEnemy;/ 刪除爆炸的對象delete pBomb;break;for(posBomb2=listBomb2.GetHeadPosition();(pos3=posBomb2)!=NULL;)CBomb

32、2 *pBomb2=(CBomb2*)listBomb2.GetNext(posBomb2);for (posEnemy = listEnemy.GetHeadPosition(); (pos1=posEnemy ) != NULL;) CRect intersectRect;CEnemy *pEnemy = (CEnemy*)listEnemy.GetNext(posEnemy);int sect=intersectRect.IntersectRect(pEnemy->GetRect(),pBomb2->GetRect(); if(sect!=0)CRect eRect;eRec

33、t=pEnemy->GetRect();listExplosion.AddTail(new CExplosion(eRect.left, eRect.top);myPlane.score+=30;if(myPlane.score%510=0)listAddblood.AddHead(new CAddBlood();if(myPlane.score%900=0&&level!=1)listaddbomb.AddHead(new CAddBomb();if(myPlane.score%600=0&&level!=1&&level!=2)list

34、lboss.AddHead(new CLittleBoss();if(myPlane.score=3630)listboss.AddHead(new CBoss();listEnemy.RemoveAt(pos1);listBomb2.RemoveAt(pos3);delete pEnemy;delete pBomb2;break;/戰(zhàn)機(jī)導(dǎo)彈擊中小BossPOSITION posa = NULL;/ 刪除敵機(jī)POSITION pose = NULL,posc=NULL;/ 刪除導(dǎo)彈for (posBomb = listBomb.GetHeadPosition(); (pose=posBomb)

35、!= NULL;)CBomb *pBomb = (CBomb*)listBomb.GetNext(posBomb);for (poslboss = listlboss.GetHeadPosition(); (posa=poslboss ) != NULL;)CRect intersectRect;CLittleBoss *plboss = (CLittleBoss*)listlboss.GetNext(poslboss);int intersectSection = intersectRect.IntersectRect(plboss->GetRect(), pBomb->GetR

36、ect();if (intersectSection != 0)CRect eRect;eRect=plboss->GetRect();myPlane.score+=30;if(myPlane.score%510=0)listAddblood.AddHead(new CAddBlood();if(myPlane.score%900=0&&level!=1)listaddbomb.AddHead(new CAddBomb();if(myPlane.score%600=0&&level!=1&&level!=2)listlboss.AddHea

37、d(new CLittleBoss();if(myPlane.score=3630)listboss.AddHead(new CBoss();if(plboss->lblood>0)plboss->lblood-=5;if(plboss->lblood<=0)listExplosion.AddTail(new CExplosion(eRect.left, eRect.top);plboss->lblood=0;listlboss.RemoveAt(posa);delete plboss;listBomb.RemoveAt(pose);/刪除爆炸的對象dele

38、te pBomb;break;for(posBomb2=listBomb2.GetHeadPosition();(posc=posBomb2)!=NULL;)CBomb2 *pBomb2=(CBomb2*)listBomb2.GetNext(posBomb2);for (poslboss = listlboss.GetHeadPosition(); (posa=poslboss ) != NULL;)CRect intersectRect;CLittleBoss *plboss = (CLittleBoss*)listlboss.GetNext(poslboss);int sect=inter

39、sectRect.IntersectRect(plboss->GetRect(),pBomb2->GetRect();if(sect!=0)CRect eRect;eRect=plboss->GetRect();myPlane.score+=30;if(myPlane.score%510=0)listAddblood.AddHead(new CAddBlood();if(myPlane.score%900=0&&level!=1)listaddbomb.AddHead(new CAddBomb();if(myPlane.score%600=0&&

40、;level!=1&&level!=2)listlboss.AddHead(new CLittleBoss();if(myPlane.score=3630)listboss.AddHead(new CBoss();if(plboss->lblood>0)plboss->lblood-=5;if(plboss->lblood<=0)listExplosion.AddTail(new CExplosion(eRect.left, eRect.top);plboss->lblood=0;listlboss.RemoveAt(posa);delete

41、 plboss;listBomb2.RemoveAt(posc);delete pBomb2;break;戰(zhàn)機(jī)導(dǎo)彈擊中大Boss的原理基本與戰(zhàn)機(jī)擊中小 Boss的相同,故此部分代碼不再給出 /戰(zhàn)機(jī)撞到敵機(jī)POSITION posEnemy=listEnemy.GetHeadPosition();POSITION pos=NULL;/刪除戰(zhàn)機(jī)和敵機(jī) for(posEnemy;(pos=posEnemy)!=NULL;)CEnemy *pEnemy = (CEnemy*)listEnemy.GetNext(posEnemy);pEnemy->Draw(&m_mDC, FALSE);C

42、Rect rect;int section = rect.IntersectRect(pEnemy->GetRect(), myPlane.GetRect();if (section != 0)CPoint point = myPlane.GetPoint();CRect eRect=pEnemy->GetRect();listExplosion.AddTail(new CExplosion(eRect.left, eRect.top);explosion.Draw(&m_mDC, FALSE);if(myPlane.blood>0)myPlane.blood-=5;

43、if(myPlane.blood<=0&&myPlane.life>1)myPlane.life-=1;myPlane.blood=50+myPlane.blood;else if(myPlane.blood<=5&&myPlane.life=1) myPlane.blood=0;myPlane.life=0;CObject *d;d = listEnemy.GetAt(pos);listEnemy.RemoveAt(pos);delete d;break;/戰(zhàn)機(jī)撞到小BossPOSITION poslboss=listlboss.GetHea

44、dPosition(),posb=NULL;for(poslboss;(posb=poslboss)!=NULL;)CLittleBoss* plboss=(CLittleBoss*)listlboss.GetNext(poslboss);plboss->Draw(&m_mDC,FALSE);CRect rect;int section = rect.IntersectRect(plboss->GetRect(), myPlane.GetRect(); if(section!=0)CRect eRect=myPlane.GetRect();listExplosion.Add

45、Tail(new CExplosion(eRect.left, eRect.top);explosion.Draw(&m_mDC, FALSE);if(myPlane.blood>0)myPlane.blood-=5;if(myPlane.blood<=0&&myPlane.life>1)myPlane.life-=1;myPlane.blood=50+myPlane.blood;if(myPlane.blood<=5&&myPlane.life=1) myPlane.blood=0;myPlane.life=0;if(plbos

46、s->lblood>0)plboss->lblood-=5;if(plboss->lblood<=0) plboss->lblood=0;listlboss.RemoveAt(posb);delete plboss;break;/戰(zhàn)機(jī)撞到大BossPOSITION posboss=listboss.GetHeadPosition(),pos7=NULL;for(posboss;(pos7=posboss)!=NULL;)CBoss* pboss=(CBoss*)listboss.GetNext(posboss);pboss->Draw(&m_m

47、DC,FALSE);CRect rect;int section = rect.IntersectRect(pboss->GetRect(), myPlane.GetRect(); if(section!=0) CRect eRect=myPlane.GetRect();listExplosion.AddTail(new CExplosion(eRect.left, eRect.top);explosion.Draw(&m_mDC, FALSE);if(myPlane.blood>0) myPlane.blood-=20;if(myPlane.blood<=0&

48、;&myPlane.life>1) myPlane.life-=1;myPlane.blood=50+myPlane.blood;if(myPlane.blood<=5&&myPlane.life=1)myPlane.blood=0;myPlane.life=0;if(pboss->bblood>0)pboss->bblood-=1;bossblood-=1;if(pboss->bblood<=0)listboss.RemoveAt(pos7);delete pboss;break;/敵機(jī),小Boss發(fā)射炮彈擊中戰(zhàn)機(jī)POSITI

49、ON posBall = listBall.GetHeadPosition();POSITION pos6 = NULL;for (posBall; (pos6 = posBall) != NULL;) CBall *pBall = (CBall*)listBall.GetNext(posBall);pBall->Draw(&m_mDC, FALSE);/戰(zhàn)機(jī)被敵機(jī)的炸彈打到時(shí),戰(zhàn)機(jī)和炸彈都刪除CRect intersectRect;int intersectSection = intersectRect.IntersectRect(myPlane.GetRect(), pBal

50、l->GetRect();CPoint pt=myPlane.GetPoint();CPoint pt4=eBall.GetPoint();if (intersectSection != 0)/爆炸效果CRect eRect;eRect=myPlane.GetRect();listExplosion.AddTail(new CExplosion(eRect.left, eRect.top);/從鏈表中刪除并釋放爆炸了的對象。if(myPlane.b100d>0)myPlane.blood-=10;if(myPlane.b100d<=0&&myPlane.lif

51、e>1)myPlane.life-=1;myPlane.b100d=50+myPlane.blood;else if(myPlane.blood<=5&&myPlane.life=1)myPlane.blood=0;myPlane.life=0;listBall.RemoveAt(pos6);delete pBall;break;/大Boss發(fā)射炮彈擊中戰(zhàn)機(jī)POSITION posbossball=listbossball.GetHeadPosition();POSITION pos11=NULL;for (posbossball; (pos11 = posboss

52、ball) != NULL;)CBossBall *pbossball = (CBossBall*)listbossball.GetNext(posbossball);pbossball->Draw(&m_mDC, FALSE);/戰(zhàn)機(jī)被敵機(jī)的炸彈打到時(shí),戰(zhàn)機(jī)和炸彈都刪除CRect Rect;int Section = Rect.IntersectRect(myPlane.GetRect(), pbossball->GetRect(); if (Section != 0)/爆炸效果CRect eRect;eRect=myPlane.GetRect();listExplosi

53、on.AddTail(new CExplosion(eRect.left, eRect.top);/從鏈表中刪除并釋放爆炸了的對象。if(myPlane.b100d>0)myPlane.blood-=10;if(myPlane.b100d<=0&&myPlane.life>1)myPlane.life-=1;myPlane.b100d=50+myPlane.blood;else if(myPlane.b100d<=5&&myPlane.life=1)myPlane.b100d=0;myPlane.life=0;1istbossba11.R

54、emoveAt(pos11);delete pbossball;break;補(bǔ)充說明4.6 窗口顯示信息模塊名稱窗口顯示信息功能描述:顯示各類信息數(shù)據(jù)結(jié)構(gòu)CDC *pDC=GetDC();/通過GetDC®數(shù)創(chuàng)建了一個(gè)CDCI型對象,如此你就可以通過指針名pDC與算法訪問這個(gè)對象的成員函數(shù)CRect rect;/包含用于定義矩形的左上角GetClientRect(&rect);/獲取的是以其自身的最左上角的點(diǎn)為坐標(biāo)原點(diǎn),即窗口左上角為坐標(biāo)原點(diǎn)CDC m_mDC;/內(nèi)存 DC 緩沖 DCm_mDC.CreateCompatibleDC(pDC);/創(chuàng)建與指定設(shè)備兼容的內(nèi)存設(shè)備上

55、下文環(huán)境DCCBitmap mBack;mBack.LoadBitmapW(IDB_dark);m_mDC.SelectObject(&mBack);background.draw(&m_mDC,FALSE);if(myPlane.blood!=0&&myPlane.life!=0)myPlane.Draw(&m_mDC,FALSE);explosion.Draw(&m_mDC,FALSE);m_mDC.TextOutW(0,0,_T("積分:");CString t;t.Format(_T("%d"),myPlane.score);m_mDC.TextOutW(40,0,t);m_mDC.TextOutW(0,40,_T("戰(zhàn)機(jī)生命值:");t.Format(_T("%d"),myPlane.life);m_mDC.TextOutW(80,40,t);m_mDC.TextOutW(0,20,_T("戰(zhàn)機(jī)血量:");t.Format(_T("%d&q

溫馨提示

  • 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

提交評論