c++飛機大戰(zhàn)實訓(xùn)報告_第1頁
c++飛機大戰(zhàn)實訓(xùn)報告_第2頁
c++飛機大戰(zhàn)實訓(xùn)報告_第3頁
c++飛機大戰(zhàn)實訓(xùn)報告_第4頁
c++飛機大戰(zhàn)實訓(xùn)報告_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上實 訓(xùn) 報 告飛機大戰(zhàn)游戲設(shè)計與開發(fā)姓名: 陸再旺專業(yè)名稱:_數(shù)字媒體技術(shù)_班 級:_2011級_學(xué) 號:_4_信息科學(xué)與工程學(xué)院二零一三年十二月目 錄2. 2.5 2.6 3.14專心-專注-專業(yè)1.項目概述此次實訓(xùn)主要是做一個飛機大戰(zhàn)的游戲,其需要實現(xiàn)的功能為:實現(xiàn)游戲?qū)ο蟮谋ㄌ匦?,文字提示功能和界面背景特效,遵循游戲?guī)則進行游戲;。游戲中的重要角色可分為如下幾個部分:戰(zhàn)機,敵機,戰(zhàn)機的導(dǎo)彈,敵機的子彈,游戲規(guī)則為:玩家通過鍵盤控制用一個戰(zhàn)機去擊毀從上下兩端進入的盡可能多的敵機從而獲得分?jǐn)?shù)。敵機數(shù)量隨機,進入畫面對戰(zhàn)機進行攻擊,兩者或戰(zhàn)機導(dǎo)彈與敵機相遇是發(fā)生爆炸

2、,戰(zhàn)機生命結(jié)束即游戲結(jié)束。2. 相關(guān)技術(shù)2.1透明貼圖函數(shù)函數(shù)原型:LoadImage(CImageList& imageList, UNIT bmpID, COLOR crMask,int cx,int cy,int nInitial)/此函數(shù)主要就是用于將圖片放入圖像鏈表imageList中。(以畫敵機為例) CGameObject:LoadImage(m_Images,IDB_Enemy,RGB(0, 0, 0), ENEMY_HEIGHT ,ENEMY_HEIGHT ,0); m_Images.Draw(pDC, 0, m_ptPos, ILD_TRANSPARENT);/此函

3、數(shù)主要就是將m_Images鏈表中的圖像顯示在pDC這個句柄中。ILD_TRANSPARENT表示是透明貼圖。它是相同大小圖像的一個集合,每個集合中均以圖像的索引序號基數(shù),圖像列表通常由大圖標(biāo)或位圖構(gòu)成,其中包含透明位圖模式??捎肳INDOWS32位應(yīng)用程序接口函數(shù)API來繪制、建立和刪除圖像,并能實現(xiàn)增加、刪除、替換和拖動圖像等操作。2.2 CObList鏈表函數(shù)原型:CobList m_ObjListball; /主要就是定義一個CObList類的一個鏈表對象用于存儲所有的與此種相關(guān)的對象,易于后續(xù)的添加刪除和提取數(shù)據(jù)。(以畫敵機為例)CObList listEnemy;POSITION

4、pos = listEnemy.GetHeadPosition(); pos != NULL; /讀取頭指針CEnemy *pEnemy=(CEnemy*) listEnemy.GetNext(pos);/GetNext獲取循環(huán)遍歷中的下一個元素2.3獲取矩形區(qū)域函數(shù) CRect rect;/定義 GetClientRect(&rect);/獲取其矩形區(qū)域rect.IntersectRect(pEnemy->GetRect(),plane.GetRect();/判斷兩個矩形是否有交接2.4鍵盤控制戰(zhàn)機位置函數(shù)/用于鍵盤控制其位置OnKeyDown(UINT nChar,UINT

5、nRepCnt,UINT nFlags) if(nChar=VK_LEFT) plane.SetHorMotion(-1); else if(nChar=VK_RIGHT) plane.SetHorMotion(1); else if(nChar=VK_UP) plane.SetVerMotion(-1); else if(nChar=VK_DOWN) plane.SetVerMotion(1);OnKeyUp (UINT nChar,UINT nRepCnt,UINT nFlags)if(nChar=VK_LEFT) plane.SetHorMotion(0); else if(nChar=

6、VK_RIGHT) plane.SetHorMotion(0); else if(nChar=VK_UP) plane.SetVerMotion(0); else if(nChar=VK_DOWN) plane.SetVerMotion(0);2.5設(shè)置定時器SetTimer(1,20,NULL); /設(shè)置每20毫秒刷新一次定時器告訴WINDOWS一個時間間隔,然后WINDOWS以此時間間隔周期性出發(fā)程序。通常由兩種方法來實現(xiàn):發(fā)送WM_TIMER消息和調(diào)用應(yīng)用程序定義的回調(diào)函數(shù)。2.6雙緩沖技術(shù)雙緩沖技術(shù)主要就是利用緩存的原理進行將所有的東西都先存在一個緩沖的虛擬的區(qū)域,然后再一次性的將所有

7、的虛擬緩存中的東西都放入實在的存儲器中。 CDC dc; /定義新的設(shè)置上下文對象,下一步繪圖就在這里 CBitmap bitmap; /定義新的位置,實際是一塊緩沖區(qū) dc.CreateCompatibleDC(NULL); / 創(chuàng)建新的DC bitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height(); /創(chuàng)建與當(dāng)前設(shè)備匹配的位圖,分配緩沖區(qū)空間 CBitmap *pOldBit=dc.SelectObject( &bitmap ); pDC->BitBlt(0,0,rect.Width(),rect.Height(

8、),&dc,0,0,SRCCOPY); /調(diào)用原系統(tǒng)DC的BitBlt方法,將新緩沖區(qū)的內(nèi)容以SRCCOPY(原拷貝)模式復(fù)制給原系統(tǒng)DC,此時,圖形將出現(xiàn)在屏幕上 bitmap.DeleteObject(); /刪除位圖,釋放空間 dc.DeleteDC(); /刪除dc,釋放空間 ReleaseDC(pDC);2.7內(nèi)存釋放技術(shù)此項目中有太多的對象生成和運用,造成了內(nèi)存的極度緊張,但游戲進行到一定的程度的時候就會出現(xiàn)內(nèi)存溢出現(xiàn)象。解決此問題的技術(shù)就是內(nèi)存釋放。例:(以敵機為例)pDC->listEnemy.RemoveAt(lastpos);/用于刪除指針delete pDC

9、;/刪除對象3. 總體設(shè)計與詳細設(shè)計有三個主要的部分組成,分別是規(guī)則子系統(tǒng)、游戲?qū)ο笞酉到y(tǒng)。系統(tǒng)的總體結(jié)構(gòu)圖如下:3.1 規(guī)則子系統(tǒng)該子系統(tǒng)主要是實現(xiàn)飛機大戰(zhàn)各項游戲規(guī)則。實現(xiàn)了需求中的游戲規(guī)則。組成結(jié)構(gòu)如下圖所示:這個系統(tǒng)包含1個重要的模塊,人工智能,它實現(xiàn)了敵機對戰(zhàn)機的攻擊以及游戲?qū)ο笈鲎脖O(jiān)測規(guī)則,其實實現(xiàn)的是代表計算機方玉玩家進行對戰(zhàn)。² 攻擊規(guī)則n 敵機在戰(zhàn)機上方或下方時發(fā)射炸彈,炸彈從下至上或從上至下射向戰(zhàn)機n 攻擊時發(fā)出聲音² 碰撞規(guī)則n 導(dǎo)彈或炸彈本身的矩形區(qū)域和敵機或戰(zhàn)機的矩形區(qū)域相交時,表示導(dǎo)彈或炸彈射中了戰(zhàn)機或敵機n 戰(zhàn)機被炸毀,游戲結(jié)束。n 敵機被炸毀

10、,戰(zhàn)機10分,出現(xiàn)文字提示。n 爆炸時產(chǎn)生聲音3.2 游戲?qū)ο笞酉到y(tǒng)該子系統(tǒng)包含了各個游戲?qū)ο蟮膶崿F(xiàn),它實現(xiàn)了需求中的部分規(guī)則以及游戲特效。本子系統(tǒng)的組織結(jié)構(gòu)圖如下:本子系統(tǒng)的組織結(jié)構(gòu)圖如下:應(yīng)用程序?qū)ο髄 游戲程序的加載l 游戲?qū)ο蟮睦L制l 游戲規(guī)則的調(diào)用l 玩家的鍵盤事件獲取游戲?qū)ο髄 敵機圖像加載l 敵機貼圖l 位置存儲3.3 系統(tǒng)模塊劃分游戲規(guī)則子系統(tǒng)模塊名稱功能簡述人工智能人機對戰(zhàn)規(guī)則的實現(xiàn)游戲子系統(tǒng)模塊名稱功能簡述應(yīng)用程序?qū)ο笥螒驅(qū)ο蟮睦L制、游戲規(guī)則的調(diào)用、玩家的鍵盤事件獲取游戲?qū)ο蟾鱾€游戲?qū)ο蟮某橄蟾割悜?zhàn)機對象戰(zhàn)機類敵機對象敵機類導(dǎo)彈對象導(dǎo)彈類炸彈對象炸彈類爆炸對象爆炸類文字對象

11、文字類3.4 主要功能模塊主要功能模塊主要就是那些類的功能模塊,主要有:1.各個游戲?qū)ο蟮馁N圖模塊2.敵機數(shù)量、方向、速度、及子彈的數(shù)量、方向、和速度控制模塊3.戰(zhàn)機的導(dǎo)彈數(shù)目,方向和速度控制模塊4.戰(zhàn)機的鍵盤控制5.敵機、子彈、和戰(zhàn)機、導(dǎo)彈的碰撞檢測及爆炸模塊6.背景添加模塊7.游戲得分和生命值及游戲結(jié)束控制4. 編碼實現(xiàn)4.1創(chuàng)建各種游戲?qū)ο箢悾ㄒ詳硻C對象為例):文件名:Enemy.h#pragma once#include <stdlib.h>#include "gameobject.h"#include "resource.h"cla

12、ss CEnemy :public CGameObjectpublic:CEnemy(void);CEnemy(void);BOOL Draw(CDC* pDC,BOOL bPause);static BOOL LoadImage();CRect GetRect()return CRect(m_ptPos,CPoint(m_ptPos.x+ENEMY_HEIGHT,m_ptPos.y+ENEMY_HEIGHT);int GetMontion() constreturn m_nMotion;/是否可以開火發(fā)射子彈BOOL Fired();private:static const int ENEM

13、Y_HEIGHT = 35;static CImageList m_Images;int m_nMotion;/方向1->向下0->停止-1->向上/圖像索引int m_nImgIndex;/速度int m_V;int m_nWait;/發(fā)射延時;文件名:Enemy.cpp#include "StdAfx.h"#include "Enemy.h"CImageList CEnemy: m_Images;/類外聲明CEnemy:CEnemy(void)/rand();需先產(chǎn)生一個隨機數(shù)種子 srand(GetTickCount(); m_p

14、tPos.x=rand()%1100; m_nImgIndex=rand()%2;/=1向下飛,=0向上飛 if( m_nImgIndex=1) m_ptPos.y=-rand()%500; m_nMotion=1;/方向向下 if(m_nImgIndex=0) m_ptPos.y=rand()%900+600;m_nMotion=-1; m_V=3;CEnemy:CEnemy(void)BOOL CEnemy:Draw(CDC* pDC,BOOL bPause)m_ptPos.y+= m_V*m_nMotion;if(m_nMotion=1)m_Images.Draw(pDC, 0, m_p

15、tPos, ILD_TRANSPARENT);elsem_Images.Draw(pDC, 1, m_ptPos, ILD_TRANSPARENT);return TRUE;/ m_Images.Draw(pDC, 0, m_ptPos, ILD_TRANSPARENT);BOOL CEnemy:LoadImage()return CGameObject:LoadImage(m_Images,IDB_Enemy,RGB(0, 0, 0), ENEMY_HEIGHT ,ENEMY_HEIGHT ,0);4.2鍵盤控制函數(shù)if(GetKeyState(VK_LEFT)&0x80) if(p

16、lane.GetPoint().x<=0) plane.SetHorMotion(0); else plane.SetHorMotion(-1); if(GetKeyState(VK_RIGHT)&0x80) if(plane.GetPoint().x+50>=rect.Width() plane.SetHorMotion(0); else plane.SetHorMotion(1); if(GetKeyState(VK_UP)&0x80) if(plane.GetPoint().y<=0) plane.SetVerMotion(0); else plane.

17、SetVerMotion(-1); if(GetKeyState(VK_DOWN)&0x80) if(plane.GetPoint().y+60>=rect.Height() plane.SetVerMotion(0); else plane.SetVerMotion(1); if(GetKeyState(VK_SPACE)&0x80)listBomb.AddTail(new CBomb(plane.GetPoint().x,plane.GetPoint().y+20);listBomb.AddTail(new CBomb(plane.GetPoint().x+20,pl

18、ane.GetPoint().y);listBomb.AddTail(new CBomb(plane.GetPoint().x+40,plane.GetPoint().y+20);4.3文字顯示函數(shù)static int Life=25;/該變量的賦值操作只執(zhí)行一次 局部變量static int Score=0;dc.SetBkMode(TRANSPARENT);/設(shè)置文字背景為透明dc.SetTextColor(RGB(255,0,0);CString LIFE;LIFE.Format(L"剩余生命:%d",Life);/轉(zhuǎn)化成字符串 dc.TextOut(10,10,LI

19、FE); dc.SetBkMode(TRANSPARENT);/設(shè)置文字背景為透明dc.SetTextColor(RGB(0,0,255);CString SCORE;SCORE.Format(L"目前得分:%d",Score);/轉(zhuǎn)化成字符串 dc.TextOut(10,30,SCORE); dc.SetBkMode(TRANSPARENT);/設(shè)置文字背景為透明dc.SetTextColor(RGB(255,255,255); if(Life<=0) if(Score<=1000) SCORE.Format(L"最終得分:%d !繼續(xù)努力喲!&qu

20、ot;,Score);/轉(zhuǎn)化成字符串 dc.TextOut(400,300,SCORE); else SCORE.Format(L"最終得分:%d !你很棒哦!",Score);/轉(zhuǎn)化成字符串 dc.TextOut(400,300,SCORE);KillTimer(1);4.4相撞產(chǎn)生爆炸效果(以我方導(dǎo)彈和敵機相撞為例)for (pos = listBall.GetHeadPosition(); pos != NULL;)/敵機子彈lastpos=pos;CBall *pBall=(CBall*) listBall.GetNext(pos);CRect rect2;/求矩形

21、交集,即是否相撞if(rect2.IntersectRect(pBall->GetRect(),plane.GetRect()Life-=1;/ 敵機子彈擊中我機,添加爆炸效果listExplosion.AddTail(new CExplosion(plane.GetRect().left,plane.GetRect().top);/爆炸效果listBall.RemoveAt(lastpos);delete pBall;else if(pBall->GetPoint().y<-9|pBall->GetPoint().y>rect.Height() listBall

22、.RemoveAt(lastpos);delete pBall; else pBall->Draw(&dc, TRUE); bool flag = false; /標(biāo)記導(dǎo)彈是否擊中敵機,true為擊中for (pos = listBomb.GetHeadPosition(); pos != NULL;)/我方導(dǎo)彈flag =false;lastpos=pos;CBomb *pBomb=(CBomb*) listBomb.GetNext(pos);POSITION pos1,lastpos1; for(pos1 = listEnemy.GetHeadPosition(); pos1

23、 != NULL;) lastpos1=pos1;CEnemy *penemy=(CEnemy*) listEnemy.GetNext(pos1); CRect rect3;/求矩形交集,即是否相撞 if(rect3.IntersectRect(pBomb->GetRect(),penemy->GetRect() Score+=10; /我方導(dǎo)彈與敵機相撞了,添加爆炸效果 listExplosion.AddTail(new CExplosion(pBomb->GetRect().left,pBomb->GetRect().top);/爆炸效果 listEnemy.Rem

24、oveAt(lastpos1); delete penemy;/刪除敵機 listBomb.RemoveAt(lastpos); delete pBomb;/刪除導(dǎo)彈 break; flag = true; else if(pBomb->GetPoint().y<-21|pBomb->GetPoint().y>rect.Height() listBomb.RemoveAt(lastpos); delete pBomb; break; else pBomb->Draw(&dc, TRUE); if(flag) break;5. 實訓(xùn)中遇到的主要問題及解決方法

25、5.1問題:閃屏解決方案:雙緩沖技術(shù) CDC* pDC=GetDC(); CRect rect;GetClientRect(&rect); CDC dc; /定義新的設(shè)置上下文對象,下一步繪圖就在這里 CBitmap bitmap; /定義新的位置,實際是一塊緩沖區(qū) dc.CreateCompatibleDC(NULL); / 創(chuàng)建新的DC bitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height(); /創(chuàng)建與當(dāng)前設(shè)備匹配的位圖,分配緩沖區(qū)空間 CBitmap *pOldBit=dc.SelectObject( &b

26、itmap );. pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dc,0,0,SRCCOPY); /調(diào)用原系統(tǒng)DC的BitBlt方法,將新緩沖區(qū)的內(nèi)容以SRCCOPY(原拷貝)模式復(fù)制給原系統(tǒng)DC,此時,圖形將出現(xiàn)在屏幕上 bitmap.DeleteObject(); /刪除位圖,釋放空間 dc.DeleteDC(); /刪除dc,釋放空間 ReleaseDC(pDC);5.2問題:鍵盤控制時出現(xiàn)陰影解決方案:鍵盤控制時消除虛影,及實現(xiàn)刷屏 GetClientRect(rect); dc.Rectangle(rect);5.3問題:鍵盤

27、控制時按鍵一下一直移動解決方案:使用OnKeyUp函數(shù)void Ctext3View:OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)/ TODO: 在此添加消息處理程序代碼和/或調(diào)用默認(rèn)值 switch(nChar) case VK_LEFT: plane.SetHorMotion(0); break; case VK_RIGHT: plane.SetHorMotion(0); break; case VK_UP: plane.SetVerMotion(0); break; case VK_DOWN: plane.SetVerMotion(0);

28、break;5.4問題:按鍵停頓解決方案:將按鍵控制放在OnTimer函數(shù)里void Ctext3View:OnTimer(UINT_PTR nIDEvent) if(GetKeyState(VK_LEFT)&0x80) if(plane.GetPoint().x<=0) plane.SetHorMotion(0); else plane.SetHorMotion(-1); if(GetKeyState(VK_RIGHT)&0x80) if(plane.GetPoint().x+50>=rect.Width() plane.SetHorMotion(0); else

29、 plane.SetHorMotion(1); if(GetKeyState(VK_UP)&0x80) if(plane.GetPoint().y<=0) plane.SetVerMotion(0); else plane.SetVerMotion(-1); if(GetKeyState(VK_DOWN)&0x80) if(plane.GetPoint().y+60>=rect.Height() plane.SetVerMotion(0); else plane.SetVerMotion(1); if(GetKeyState(VK_SPACE)&0x80)listBomb.AddTail(new CBomb(plane.GetPoint().x,plane.GetPoint().y+20);listBomb.AddTail(new CBomb(plane.GetPoint().x+20,plane.GetPoint().y);listBomb.AddTail(new CBomb(plane.GetPoint().x+40,plane.GetPoint().y+20);5.5問題:程序中斷問題解決方案:在我機導(dǎo)彈與敵機相撞代碼中加入標(biāo)識符,防止指針懸空。bool flag = false; /標(biāo)記導(dǎo)彈是否擊中敵機,true為擊中f

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論