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

下載本文檔

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

文檔簡(jiǎn)介

.實(shí) 訓(xùn) 報(bào) 告飛機(jī)大戰(zhàn)游戲設(shè)計(jì)與開發(fā) 專業(yè)名稱: 物聯(lián)網(wǎng)工程 班 級(jí): 物聯(lián)網(wǎng)一班姓 名: 李 萬(wàn) 學(xué) 號(hào): 201301052208信息科學(xué)與工程學(xué)院二零一四年十二月 目 錄1. 概述32. 相關(guān)技術(shù)32.1關(guān)于碰撞檢測(cè)的相關(guān)函數(shù)32.2 CObList鏈表32.3 設(shè)置定時(shí)器、銷毀定時(shí)器32.4 雙緩沖繪圖33. 總體設(shè)計(jì)與詳細(xì)設(shè)計(jì)33.1 系統(tǒng)模塊劃分33.1.1規(guī)則子系統(tǒng)43.1.2 游戲?qū)ο笞酉到y(tǒng)43.2 主要功能模塊54. 編碼實(shí)現(xiàn)54.1 游戲初始化54.2 設(shè)置動(dòng)態(tài)背景64.3 顯示文字以及繪制游戲?qū)ο?4.4 隨機(jī)產(chǎn)生敵機(jī)84.5 戰(zhàn)機(jī)移動(dòng)以及發(fā)射導(dǎo)彈84.6 敵機(jī)發(fā)射炮彈94.7 碰撞檢測(cè)及音效105. 實(shí)訓(xùn)中遇到的主要問題及解決方法146. 實(shí)訓(xùn)體會(huì)14.1. 概述飛機(jī)大戰(zhàn)游戲是在Microsoft Visual Studio編程軟件的MFC環(huán)境下制作的一款游戲,界面簡(jiǎn)潔流暢、游戲方式簡(jiǎn)單。 游戲主要實(shí)現(xiàn)的功能和規(guī)則如下:(1)利用鍵盤中的上下左右鍵控制我方戰(zhàn)機(jī),空格鍵發(fā)射子彈。戰(zhàn)機(jī)初始有一定量的血量。(2)屏幕上隨機(jī)產(chǎn)生敵機(jī),戰(zhàn)機(jī)產(chǎn)生的數(shù)量和當(dāng)前關(guān)卡,關(guān)卡越高,產(chǎn)生的敵機(jī)越多,游戲難度越大。而且敵機(jī)產(chǎn)生的位置和速度是不確定的。只有當(dāng)我機(jī)位于敵機(jī)下方時(shí),敵機(jī)才會(huì)產(chǎn)生子彈,默認(rèn)情況下是不發(fā)射任何子彈的。(3)戰(zhàn)機(jī)子彈打中敵機(jī),敵機(jī)就會(huì)爆炸,同時(shí)玩家分?jǐn)?shù)會(huì)增加,每得1000分進(jìn)入下一關(guān)。 2. 相關(guān)技術(shù) 在設(shè)計(jì)該游戲時(shí),用到許多技術(shù),這里介紹幾個(gè)相對(duì)重要的技術(shù)。2.1關(guān)于碰撞檢測(cè)的相關(guān)函數(shù)用CRect類的GetRect()函數(shù)可以獲得當(dāng)前對(duì)象的矩形區(qū)域, IntersectRect()并用此函數(shù)判斷戰(zhàn)機(jī)與敵機(jī),子彈與戰(zhàn)機(jī),我方導(dǎo)彈與敵機(jī),戰(zhàn)機(jī)與物品是否相撞。2.2 CObList鏈表使用CObList鏈表來分別存儲(chǔ)敵機(jī),炸彈,導(dǎo)彈,爆炸效果。CobList類似于一個(gè)雙向鏈表,POSITION類型的變量為鏈表的鍵。使用POSITION變量,既可以作為鏈表循環(huán)中的循環(huán)變量,也可以作為標(biāo)記某個(gè)位置的標(biāo)簽。我們可以通過獲得某元素的POSITION來訪問它。本程序中主要用到的函數(shù)有:GetHeadPosition()獲取鏈表首元素的POSITION;AddTail()向鏈表尾部添加新的元素;GetNext( POSITION& rPosition )返回當(dāng)前rPosition指向的元素,并使rPosition指向下一個(gè)元素。2.3 設(shè)置定時(shí)器、銷毀定時(shí)器SetTimer()函數(shù)來設(shè)置定時(shí)器,控制每隔多少毫秒執(zhí)行一次什么任務(wù)。用KillTime()函數(shù)來銷毀定時(shí)器。2.4 雙緩沖技術(shù) 為了避免窗體頻繁閃爍,引入雙緩沖技術(shù)。雙緩沖的原理是先建立一個(gè)內(nèi)存DC,將游戲?qū)ο罄L制到內(nèi)存DC上,再一次性的把內(nèi)存中繪制好的圖形“拷貝”到設(shè)備DC上。采取這種方法可以提高繪圖速度,極大的改善繪圖效果。3. 總體設(shè)計(jì)與詳細(xì)設(shè)計(jì)3.1 系統(tǒng)模塊劃分有兩個(gè)主要的部分組成,分別是規(guī)則子系統(tǒng)、游戲?qū)ο笞酉到y(tǒng)。3.1.1規(guī)則子系統(tǒng)該子系統(tǒng)主要是實(shí)現(xiàn)飛機(jī)大戰(zhàn)各項(xiàng)游戲規(guī)則。實(shí)現(xiàn)了需求中的游戲規(guī)則。這個(gè)系統(tǒng)模塊實(shí)現(xiàn)了敵機(jī)對(duì)戰(zhàn)機(jī)的攻擊、以及游戲?qū)ο笈鲎矙z測(cè)規(guī)則。 攻擊規(guī)則n 敵機(jī)在戰(zhàn)機(jī)上方時(shí)發(fā)射炸彈,炸彈從上至下射向戰(zhàn)機(jī) 碰撞規(guī)則n 戰(zhàn)機(jī)所在矩形區(qū)域與獎(jiǎng)品所在矩形區(qū)域相交時(shí),表示戰(zhàn)機(jī)獲得該獎(jiǎng)勵(lì)。n 導(dǎo)彈或炸彈本身的矩形區(qū)域和敵機(jī)或戰(zhàn)機(jī)的矩形區(qū)域相交時(shí),表示導(dǎo)彈或炸彈射中了敵機(jī)或戰(zhàn)機(jī)。n 敵機(jī)擊中戰(zhàn)機(jī),戰(zhàn)機(jī)血量減少。n 戰(zhàn)機(jī)擊中敵機(jī),敵機(jī)被炸毀,戰(zhàn)機(jī)得分增加。n 戰(zhàn)機(jī)血量為0,游戲結(jié)束。3.1.2 游戲?qū)ο笞酉到y(tǒng)該子系統(tǒng)包含了各個(gè)游戲?qū)ο蟮膶?shí)現(xiàn)。 應(yīng)用程序?qū)ο髄 游戲程序的加載l 游戲?qū)ο蟮睦L制l 游戲規(guī)則的調(diào)用l 玩家的鍵盤事件獲取 游戲?qū)ο髄 敵機(jī)繪圖l 戰(zhàn)機(jī)繪圖l 子彈繪圖l 爆炸效果繪圖類體系如下: 主要有CMyPlane:戰(zhàn)機(jī),CEnemy:敵機(jī),CIenemy:敵機(jī)boss,CBall:炮彈,CBobm:導(dǎo)彈,CExplossion:爆炸效果,CHeart:紅心(吃了可以加血)。3.2 主要功能模塊主要功能模塊主要就是那些類的功能模塊,主要有:1、各個(gè)游戲?qū)ο蟮馁N圖模塊2、敵機(jī)數(shù)量、方向、速度以及子彈的數(shù)量、方向和速度控制模塊。3、戰(zhàn)機(jī)的導(dǎo)彈的數(shù)目、方向和速度控制模塊。4、戰(zhàn)機(jī)的鍵盤控制位置模塊。5、敵機(jī)、子彈和戰(zhàn)機(jī)、導(dǎo)彈的碰撞檢測(cè)以及爆炸模塊。6、背景添加模塊。7、戰(zhàn)機(jī)速度控制模塊。8、游戲關(guān)卡和游戲難易度。9、游戲得分和生命值控制以及游戲結(jié)束。10、游戲音效控制模塊。4. 編碼實(shí)現(xiàn)由于編寫了多個(gè)類來實(shí)現(xiàn)該游戲功能,所以程序較多,這里只展示核心部分。程序如下:4.1游戲初始化void CPlaneGameView:OnInitialUpdate()CView:OnInitialUpdate();/ TODO: 在此添加專用代碼和/或調(diào)用基類/初始化游戲 m_pDC=new CClientDC(this);m_pMemDC=new CDC; m_pMemDC-CreateCompatibleDC(m_pDC);m_pMemBitmap=new CBitmap;/建立內(nèi)存位圖CRect ck;this-GetClientRect(&ck);m_pMemBitmap-CreateCompatibleBitmap(m_pDC,ck.Width(),ck.Height();m_pMemDC-SelectObject(m_pMemBitmap);/將位圖選入內(nèi)存DC CRect rc;GetClientRect(rc);/產(chǎn)生隨機(jī)數(shù)種子srand( (unsigned)time( NULL ) );/建立設(shè)備DCm_pDC = new CClientDC(this);/建立內(nèi)存DCm_pMemDC = new CDC;m_pMemDC-CreateCompatibleDC(m_pDC);/建立內(nèi)存位圖m_pMemBitmap = new CBitmap;m_pMemBitmap-CreateCompatibleBitmap(m_pDC,GAME_WIDTH,GAME_HEIGHT);/將位圖選入內(nèi)存DCm_pMemDC-SelectObject(m_pMemBitmap);CMyPlane:LoadImage();CEnemy:LoadImage();CBomb:LoadImage();CBall:LoadImage();CExplosion:LoadImage();CHeart:LoadImage();CIenemy:LoadImage();/產(chǎn)生主我方戰(zhàn)機(jī)m_pMe = new CMyPlane;/啟動(dòng)游戲SetTimer(1,30,NULL); SetTimer(2, 240, NULL);4.2設(shè)置動(dòng)態(tài)背景CBitmap bmp;bmp.LoadBitmapW(IDB_Background); /創(chuàng)建位圖m_pMemDC-SelectObject(&bmp);pMemDC-BitBlt(0,0,800,600,m_pMemDC,0,imagelocation,SRCCOPY);/設(shè)置動(dòng)態(tài)背景if(imagelocation SetBkMode(TRANSPARENT);/文字背景透明 wsprintf(lifeleft, L生命值:%d, m_pMe-HP ); pMemDC-SetTextColor( RGB(255, 255,0) ); /字體顏色 pMemDC-TextOutW(10,10, lifeleft, _tcslen(lifeleft);/字體位置 wsprintf(lifeleft, L剩余命數(shù):%d, m_pMe-life ); pMemDC-SetTextColor( RGB(255, 255,0) ); pMemDC-TextOutW(10,35, lifeleft, _tcslen(lifeleft); wsprintf(Score, L得分:%d, m_pMe-score ); pMemDC-SetTextColor( RGB(255, 0, 0) ); pMemDC-TextOutW(10,60, Score, _tcslen(Score); wsprintf(Level, L 第%d 關(guān), m_pMe-level ); pMemDC-SetTextColor( RGB(255, 255, 255) ); pMemDC-TextOutW(10,85, Level, _tcslen(Level);/繪制我方戰(zhàn)機(jī)if(m_pMe!=NULL) m_pMe-Draw(m_pMemDC,FALSE);else /游戲結(jié)束提醒CString str=_T(Game Over!);pMemDC-SetBkMode(TRANSPARENT);pMemDC-SetTextAlign(TA_CENTER);pMemDC-SetTextColor(RGB(255,0,0);pMemDC-TextOut(GAME_WIDTH/2,GAME_HEIGHT/2,str);if(m_pMe!=NULL & m_pMe-score = 10000) /游戲勝利提醒 CString str=_T(You Win!);pMemDC-SetBkMode(TRANSPARENT);pMemDC-SetTextAlign(TA_CENTER);pMemDC-SetTextColor(RGB(255,0,0);pMemDC-TextOut(GAME_WIDTH/2,GAME_HEIGHT/2,str);/繪制飛機(jī)炮彈、敵機(jī)、獎(jiǎng)勵(lì)、for(int i=0;iDraw(pMemDC,FALSE)m_ObjListi.RemoveAt(pos2);delete pObj;/復(fù)制內(nèi)存DC到設(shè)備DCm_pDC-BitBlt(0,0,GAME_WIDTH,GAME_HEIGHT,m_pMemDC,0,0,SRCCOPY);4.4隨機(jī)產(chǎn)生敵機(jī)/隨機(jī)產(chǎn)生敵機(jī)if(m_pMe!=NULL & m_pMe-score 10000 ) /控制生成條件 static int nCreator = rand() %5; if(nCreatorlevel) nCreator = rand()%5+10; m_ObjListenEnemy.AddTail(new CEnemy); nCreator-; if(m_pMe=NULL | m_pMe-score = 10000) /通關(guān)或者沒有生命剩余,不再產(chǎn)生敵機(jī)return; 4.5戰(zhàn)機(jī)移動(dòng)以及發(fā)射導(dǎo)彈/檢測(cè)四個(gè)方向鍵,移動(dòng)戰(zhàn)機(jī)if(GetKey(VK_UP)=1) m_pMe-SetVerMotion(1); if(GetKey(VK_DOWN)=1)m_pMe-SetVerMotion(-1);if(GetKey(VK_RIGHT)=1)m_pMe-SetHorMotion(1);if(GetKey(VK_LEFT)=1)m_pMe-SetHorMotion(-1);/產(chǎn)生戰(zhàn)機(jī)導(dǎo)彈if(GetKey(VK_SPACE)=1)/按下了空格鍵CBomb*cbo1=newCBomb(pDoc-m_pMe-m_ptPos.x+10,pDoc-m_pMe-m_ptPos.y,1);pDoc-m_ObListBomb.AddTail(cbo1);CBomb*cbo2=newCBomb(pDoc-m_pMe-m_ptPos.x+30,pDoc-m_pMe-m_ptPos.y,1);pDoc-m_ObListBomb.AddTail(cbo2);4.6敵機(jī)發(fā)射炮彈/敵機(jī)發(fā)射子彈CPoint PlanePt = m_pMe-GetPoint(); /獲取我方戰(zhàn)機(jī)方位for(POSITION ePos=m_ObjListenEnemy.GetHeadPosition();ePos!=NULL;) CEnemy* pEnemy = (CEnemy*)m_ObjListenEnemy.GetNext(ePos); if(!pEnemy-Fired() /如果敵機(jī)沒處于發(fā)射狀態(tài),繼續(xù)循環(huán) continue; CPoint ePt = pEnemy-GetPoint(); /獲取敵方戰(zhàn)機(jī)方位 BOOL fa=FALSE; /標(biāo)記是否發(fā)射 /敵機(jī)在戰(zhàn)機(jī)前面 if(pEnemy-GetMontion()=1 & ePt.yGetMontion()=-1 & ePt.yPlanePt.y)/ fa= TRUE; if(fa & ePt.x = PlanePt.x & ePt.xGetMontion(); 4.7碰撞檢測(cè)及音效/敵機(jī)子彈炸掉戰(zhàn)機(jī)POSITION bPos1=NULL,bPos2=NULL;CRect mRect = m_pMe-GetRect();for(bPos1=m_ObjListenBall.GetHeadPosition();( bPos2 = bPos1 ) != NULL;)CBall* pBall = (CBall*)m_ObjListenBall.GetNext(bPos1);CRect bRect = pBall-GetRect();CRect tmpRect; if(tmpRect.IntersectRect(&bRect,mRect) /刪除子彈 m_ObjListenBall.RemoveAt(bPos2); delete pBall;/添加爆炸效果 m_ObjListenExplosion.AddTail(new CExplosion(mRect.left,mRect.top); PlaySound(TEXT(E:/飛機(jī)大戰(zhàn)/plane/bang.wav), NULL, SND_FILENAME | SND_ASYNC | SND_NOSTOP);m_pMe-HP -= 10;if(m_pMe-HP life-; m_pMe-HP = 100;if(m_pMe-life GetRect();CRect tmpRect;if(tmpRect.IntersectRect(eRect,mRect) /如果交不為空,則返回非零值;否則,如果交為空則返回/刪除敵機(jī)m_ObjListenEnemy.RemoveAt(ePos2);/從索引中刪除delete pEnemy;/添加爆炸效果 m_ObjListenExplosion.AddTail(new CExplosion(mRect.left,mRect.top);PlaySound(TEXT(E:/飛機(jī)大戰(zhàn)/plane/bang.wav), NULL, SND_FILENAME | SND_ASYNC | SND_NOSTOP);m_pMe-HP -= 20;if(m_pMe-HP life-; m_pMe-HP = 100; if(m_pMe-life Bkind = 1; /添加爆炸效果 m_ObjListenExplosion.AddTail( new CExplosion(mRect.left,mRect.top) ); /刪除敵機(jī) m_ObjListenEnemy.RemoveAt(ePos2); delete pEnemy; POSITION baPos1=NULL,baPos2=NULL;for(baPos1=m_ObjListenBallA.GetHeadPosition();(baPos2=baPos1)!=NULL;)CBallA* pBallA = (CBallA*)m_ObjListenBallA.GetNext(baPos1);CRect prRect = pBallA-GetRect();CRect tmpRect;/戰(zhàn)機(jī)導(dǎo)彈炸掉敵機(jī)POSITION mPos1=NULL,mPos2=NULL;for(mPos1=m_ObjListenBomb.GetHeadPosition();(mPos2=mPos1)!=NULL;)CBomb* pBomb = (CBomb*)m_ObjListenBomb.GetNext(mPos1);CRect bRect = pBomb-GetRect();POSITION ePos1=NULL,ePos2=NULL;for(ePos1=m_ObjListenEnemy.GetHeadPosition();(ePos2=ePos1)!=NULL;)CEnemy* pEnemy = (CEnemy*)m_ObjListenEnemy.GetNext(ePos1);CRect mRect = pEnemy-GetRect();CRect tmpRect;if(tmpRect.IntersectRect(&bRect,mRect)m_pMe-score += 10;/int x=m_pMe-level;if(m_pMe-score = 1000*(m_pMe-level) /& (m_pMe-level)%2 = 1m_pMe-level+;/添加爆炸效果m_ObjListenExplosion.AddTail(new CExplosion(mRect.left,mRect.top);PlaySound(TEXT(E:/飛機(jī)大戰(zhàn)/plane/bang.wav), NULL, SND_FILENAME | SND_ASYNC | SND_NOSTOP);/刪除導(dǎo)彈if(m_pMe-Bkind != 2)m_ObjListenBomb.RemoveAt(mPos2);delete pBomb;/刪除敵機(jī)m_ObjListenEnemy.RemoveAt(ePos2);delete pEnemy;break;另外還有敵機(jī)BOSS以及大招代碼:if (nIDEvent=2)/敵機(jī)BOSS發(fā)射炮彈檢測(cè)POSITION Ie1 = NULL, Ie2 = NULL;Ie1 = m_ObjListIenEnemy.GetHeadPosition();while (Ie2 = Ie1) != NULL)CIenemy *pIenemy = (CIenemy *) m_ObjListIenEnemy.GetNext(Ie1);for (int i = -15; i GetPoint().x + 50, pIenemy-GetPoint().y + 135, 100+i);/按鍵放大招 if (nChar = VK_CONTROL&damage0)/全屏炮彈爆炸POSITION Ba1 = NULL, Ba2 = NULL;Ba1 = m_ObjListBal

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論