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

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(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è)名稱:___數(shù)字媒體技術(shù) 班級(jí): 2011級(jí) 學(xué)號(hào):___201101051114 信息科學(xué)與工程學(xué)院二零一三年十二月目錄項(xiàng)目概述 錯(cuò)誤!未定義書簽。相關(guān)技術(shù) 錯(cuò)誤!未定義書簽。2.1透明貼圖技術(shù) 錯(cuò)誤!未定義書簽。2.2CObList技術(shù) 錯(cuò)誤!未定義書簽。2.3獲取矩形區(qū)域函數(shù) 錯(cuò)誤!未定義書簽。2.4鍵盤控制戰(zhàn)機(jī)位置函數(shù) 錯(cuò)誤!未定義書簽。TOC\o"1-5"\h\z\o"CurrentDocument"2.5設(shè)置定時(shí)器 4\o"CurrentDocument"2.6雙緩沖技術(shù) 4\o"CurrentDocument"2.7內(nèi)存釋放技術(shù) 4\o"CurrentDocument"總體設(shè)計(jì)與詳細(xì)設(shè)計(jì) 5\o"CurrentDocument"3.1規(guī)貝y子系統(tǒng) 5\o"CurrentDocument"3.2游戲?qū)ο笞酉到y(tǒng) 5\o"CurrentDocument"3.3系統(tǒng)模塊戈U分 6\o"CurrentDocument"3.4主要功能模塊 7\o"CurrentDocument"編碼實(shí)現(xiàn) 7\o"CurrentDocument"實(shí)訓(xùn)中遇到的主要問題及解決方法 11\o"CurrentDocument"實(shí)訓(xùn)體會(huì) 14項(xiàng)目概述此次實(shí)訓(xùn)主要是做一個(gè)飛機(jī)大戰(zhàn)的游戲, 其需要實(shí)現(xiàn)的功能為: 實(shí)現(xiàn)游戲?qū)ο蟮谋ㄌ匦?,文字提示功能和界面背景特效,遵循游戲?guī)則進(jìn)行游戲; 。游戲中的重要角色可分為如下幾個(gè)部分:戰(zhàn)機(jī),敵機(jī),戰(zhàn)機(jī)的導(dǎo)彈,敵機(jī)的子彈,游戲規(guī)則為:玩家通過鍵盤控制用一個(gè)戰(zhàn)機(jī)去擊毀從上下兩端進(jìn)入的盡可能多的敵機(jī)從而獲得分?jǐn)?shù)。敵機(jī)數(shù)量隨機(jī),進(jìn)入畫面對(duì)戰(zhàn)機(jī)進(jìn)行攻擊,兩者或戰(zhàn)機(jī)導(dǎo)彈與敵機(jī)相遇是發(fā)生爆炸,戰(zhàn)機(jī)生命結(jié)束即游戲結(jié)束。相關(guān)技術(shù)2.1透明貼圖函數(shù)函數(shù)原型:Loadlmage(ClmageList& imageList,UNITbmpID,COLORcrMask,intcx,int cy,intnlnitial)〃此函數(shù)主要就是用于將圖片放入圖像鏈表 imageList中。(以畫敵機(jī)為例)CGameObject::Loadlmage(m」mages,IDB_Enemy,RGB(0,0,0),ENEMY_HEIGHT,ENEMY_HEIGHT,0);m」mages.Draw(pDC,0,m_ptPos,ILD_TRANSPARENT);//此函數(shù)主要就是將m_Images鏈表中的圖像顯示在pDC這個(gè)句柄中。ILD_TRANSPAREN表示是透明貼圖。它是相同大小圖像的一個(gè)集合,每個(gè)集合中均以圖像的索引序號(hào)基數(shù),圖像列表通常由大圖標(biāo)或位圖構(gòu)成,其中包含透明位圖模式。可用 WINDOWS3位應(yīng)用程序接口函數(shù)API來(lái)繪制、建立和刪除圖像,并能實(shí)現(xiàn)增加、刪除、替換和拖動(dòng)圖像等操作。2.2CObList鏈表函數(shù)原型:CobListm_ObjListball;// 主要就是定義一個(gè)CObList類的一個(gè)鏈表對(duì)象用于存儲(chǔ)所有的與此種相關(guān)的對(duì)象,易于后續(xù)的添加刪除和提取數(shù)據(jù)。(以畫敵機(jī)為例)CObListlistEnemy;POSITIONpos=listEnemy.GetHeadPosition();pos!=NULL; //讀取頭指針CEnemy*pEnemy=(CEnemy*)listEnemy.GetNext(pos); //GetNext獲取循環(huán)遍歷中的下一個(gè)2.3獲取矩形區(qū)域函數(shù)CRectrect;//定義GetClientRect(&rect);〃 獲取其矩形區(qū)域;//;//判斷兩個(gè)矩形是否有交接2.4鍵盤控制戰(zhàn)機(jī)位置函數(shù)//用于鍵盤控制其位置OnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags)if(nChar==VK_LEFT)plane.SetHorMotion(-1);elseif(nChar==VK_RIGHT)plane.SetHorMotion(1);elseif(nChar==VK_UP)plane.SetVerMotion(-1);elseif(nChar==VK_DOWN)plane.SetVerMotion(1);OnKeyUp(UINTnChar,UINTnRepCnt,UINTnFlags)if(nChar==VK_LEFT)plane.SetHorMotion(0);elseif(nChar==VK_RIGHT)plane.SetHorMotion(0);elseif(nChar==VK_UP)plane.SetVerMotion(0);elseif(nChar==VK_DOWN)plane.SetVerMotion(0);2.5設(shè)置定時(shí)器SetTimer(1,20,NULL);//設(shè)置每20毫秒刷新一次定時(shí)器告訴WINDOWS個(gè)時(shí)間間隔,然后 WINDOW以此時(shí)間間隔周期性出發(fā)程序。通常由兩種方法來(lái)實(shí)現(xiàn):發(fā)送WM_TIME消息和調(diào)用應(yīng)用程序定義的回調(diào)函數(shù)。2.6雙緩沖技術(shù)雙緩沖技術(shù)主要就是利用緩存的原理進(jìn)行將所有的東西都先存在一個(gè)緩沖的虛擬的區(qū)域, 然后再一次性的將所有的虛擬緩存中的東西都放入實(shí)在的存儲(chǔ)器中。CDCde;//定義新的設(shè)置上下文對(duì)象,下一步繪圖就在這里CBitmapbitmap;//定義新的位置,實(shí)際是一塊緩沖區(qū)dc.CreateCompatibleDC(NULL);//創(chuàng)建新的DCbitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height()); //創(chuàng)建與當(dāng)前設(shè)備匹配的位圖,分配緩沖區(qū)空間CBitmap*pOldBit=dc.SelectObject(&bitmap);pDC->BitBlt(O,O,rect.Width(),rect.Height(),&dc,O,O,SRCCOPY); //調(diào)用原系統(tǒng)DC的BitBlt方法,將新緩沖區(qū)的內(nèi)容以 SRCCOPY原拷貝)模式復(fù)制給原系統(tǒng)DC,此時(shí),圖形將出現(xiàn)在屏幕上bitmap.DeleteObject(); //刪除位圖,釋放空間dc.DeleteDC();//刪除dc,釋放空間ReleaseDC(pDC);2.7內(nèi)存釋放技術(shù)此項(xiàng)目中有太多的對(duì)象生成和運(yùn)用, 造成了內(nèi)存的極度緊張, 但游戲進(jìn)行到一定的程度的時(shí)候就會(huì)出現(xiàn)內(nèi)存溢出現(xiàn)象。解決此問題的技術(shù)就是內(nèi)存釋放。例:(以敵機(jī)為例)pDC->listEnemy.RemoveAt(lastpos);// 用于刪除指針deletepDC;// 刪除對(duì)象3?總體設(shè)計(jì)與詳細(xì)設(shè)計(jì)有三個(gè)主要的部分組成,分別是規(guī)則子系統(tǒng)、游戲?qū)ο笞酉到y(tǒng)。系統(tǒng)的總體結(jié)構(gòu)圖如下:3.1規(guī)則子系統(tǒng)該子系統(tǒng)主要是實(shí)現(xiàn)飛機(jī)大戰(zhàn)各項(xiàng)游戲規(guī)則。實(shí)現(xiàn)了需求中的游戲規(guī)則。組成結(jié)構(gòu)如下圖所示:這個(gè)系統(tǒng)包含1個(gè)重要的模塊,人工智能,它實(shí)現(xiàn)了敵機(jī)對(duì)戰(zhàn)機(jī)的攻擊以及游戲?qū)ο笈鲎脖O(jiān)測(cè)規(guī)則,其實(shí)實(shí)現(xiàn)的是代表計(jì)算機(jī)方玉玩家進(jìn)行對(duì)戰(zhàn)。攻擊規(guī)則敵機(jī)在戰(zhàn)機(jī)上方或下方時(shí)發(fā)射炸彈,炸彈從下至上或從上至下射向戰(zhàn)機(jī)攻擊時(shí)發(fā)出聲音碰撞規(guī)則導(dǎo)彈或炸彈本身的矩形區(qū)域和敵機(jī)或戰(zhàn)機(jī)的矩形區(qū)域相交時(shí), 表示導(dǎo)彈或炸彈射中了戰(zhàn)機(jī)或敵機(jī)戰(zhàn)機(jī)被炸毀,游戲結(jié)束。敵機(jī)被炸毀,戰(zhàn)機(jī)10分,出現(xiàn)文字提示。

爆炸時(shí)產(chǎn)生聲音3.2游戲?qū)ο笞酉到y(tǒng)該子系統(tǒng)包含了各個(gè)游戲?qū)ο蟮膶?shí)現(xiàn),它實(shí)現(xiàn)了需求中的部分規(guī)則以及游戲特效。本子系統(tǒng)的組織結(jié)構(gòu)圖如下:本子系統(tǒng)的組織結(jié)構(gòu)圖如下:應(yīng)用程序?qū)ο笥螒虺绦虻募虞d游戲?qū)ο蟮睦L制游戲規(guī)則的調(diào)用玩家的鍵盤事件獲取游戲?qū)ο髷硻C(jī)圖像加載敵機(jī)貼圖位置存儲(chǔ)3.3系統(tǒng)模塊劃分游戲規(guī)則子系統(tǒng)模塊名稱功能簡(jiǎn)述人工智能人機(jī)對(duì)戰(zhàn)規(guī)則的實(shí)現(xiàn)游戲子系統(tǒng)模塊名稱功能簡(jiǎn)述應(yīng)用程序?qū)ο笥螒驅(qū)ο蟮睦L制、游戲規(guī)則的調(diào)用、玩家的鍵盤事件獲取游戲?qū)ο蟾鱾€(gè)游戲?qū)ο蟮某橄蟾割悜?zhàn)機(jī)對(duì)象戰(zhàn)機(jī)類敵機(jī)對(duì)象敵機(jī)類導(dǎo)彈對(duì)象導(dǎo)彈類炸彈對(duì)象炸彈類爆炸對(duì)象爆炸類文字對(duì)象文字類3.4主要功能模塊主要功能模塊主要就是那些類的功能模塊,主要有:各個(gè)游戲?qū)ο蟮馁N圖模塊敵機(jī)數(shù)量、方向、速度、及子彈的數(shù)量、方向、和速度控制模塊戰(zhàn)機(jī)的導(dǎo)彈數(shù)目,方向和速度控制模塊戰(zhàn)機(jī)的鍵盤控制敵機(jī)、子彈、和戰(zhàn)機(jī)、導(dǎo)彈的碰撞檢測(cè)及爆炸模塊背景添加模塊游戲得分和生命值及游戲結(jié)束控制編碼實(shí)現(xiàn)4.1創(chuàng)建各種游戲?qū)ο箢?以敵機(jī)對(duì)象為例):文件名:Enemy.h#pragmaonce#include<stdlib.h>#include"gameobject.h"#include"resource.h"classCEnemy:publicCGameObject{public:CEnemyVoid);~CEnemyVoid);BOOLDraw(CDC*pDC,BOOLbPause);staticBOOLLoadlmage();CRectGetRect(){returnCRect(m_ptPos,CPoint(m_ptPos.x+ENEMY_HEIGHT,m_ptPos.y+ENEMY_HEIGHT));}intGetMontion() const{returnm_nMotion;}//是否可以開火發(fā)射子彈BOOLFired();private:staticconstintENEMY_HEIGHT=35;staticClmageListm_lmages;int m_nMotion; //方向1->向下0->停止-1->向上//圖像索引intm_nImglndex;//速度intm_V;intm_nWait;//發(fā)射延時(shí)};文件名:Enemy.cpp#include"StdAfx.h"#include"Enemy.h"CImageListCEnemy::m」mages;//類外聲明CEnemy::CEnemy(void){//rand(); 需先產(chǎn)生一個(gè)隨機(jī)數(shù)種子srand(GetTickCount());m_ptPos.x=rand()%1100;m_nImgIndex=rand()%2; //=1向下飛,=0向上飛if(m_nlmglndex==1){m_ptPos.y=-rand()%500;m_nMotion=1; //方向向下}if(m_nlmglndex==0){m_ptPos.y=rand()%900+600;m_nMotion=-1;}m_V=3;}CEnemy::~CEnemy(void){}BOOLCEnemy::Draw(CDC*pDC,BOOLbPause){ m_ptPos.y+=m_V*m_nMotion;if(m_nMotion==1)m」mages.Draw(pDC,0,m_ptPos,ILD_TRANSPARENT);elsem」mages.Draw(pDC,1,m_ptPos,ILD_TRANSPARENT);returnTRUE;//m」mages.Draw(pDC,0,m_ptPos,ILD_TRANSPARENT);}BOOLCEnemy::LoadImage(){returnCGameObject::LoadImage(m」mages,IDB_Enemy,RGB(0,0,0),ENEMY_HEIGHT,ENEMY_HEIGHT,0);}4.2鍵盤控制函數(shù)if(GetKeyState(VK_LEFT)&0x80)

{if(plane.GetPoint().x<=0)plane.SetHorMotion(0);elseplane.SetHorMotion(-1);}if(GetKeyState(VK_RIGHT)&0x80){if(plane.GetPoint().x+50>=rect.Width())plane.SetHorMotion(0);elseplane.SetHorMotion(1);}if(GetKeyState(VK_UP)&0x80){if(plane.GetPoint().y<=0)plane.SetVerMotion(0);elseplane.SetVerMotion(-1);}if(GetKeyState(VK_DOWN)&0x80){if(plane.GetPoint().y+60>=rect.Height())plane.SetVerMotion(0);elseplane.SetVerMotion(1);}if(GetKeyState(VK_SPACE)&0x80){listBomb.AddTail(newCBomb(plane.GetPoint().x,plane.GetPoint().y+20));listBomb.AddTail(newCBomb(plane.GetPoint().x+20,plane.GetPoint().y));listBomb.AddTail(newCBomb(plane.GetPoint().x+40,plane.GetPoint().y+20));}局部變量4.3文字顯示函數(shù)局部變量static intLife=25;II該變量的賦值操作只執(zhí)行一次static intScore=0;dc.SetBkMode(TRANSPARENT)//設(shè)置文字背景為透明dc.SetTextColor(RGB(255,0,0));CStringLIFE;LIFE.Format(L"剩余生命:%d",Life);II轉(zhuǎn)化成字符串dc.TextOut(10,10,LIFE);dc.SetBkMode(TRANSPARENT);//設(shè)置文字背景為透明dc.SetTextColor(RGB(0,0,255));CStringSCORE;SCORE.Format(L"目前得分:%d",Score);II轉(zhuǎn)化成字符串dc.TextOut(1O,3O,SCORE);dc.SetBkMode(TRANSPARENT);II設(shè)置文字背景為透明dc.SetTextColor(RGB(255,255,255));if(Life<=0){if(Score<=1000){SCORE.Format(L"最終得分:%d!!!繼續(xù)努力喲?。?”,Score);II轉(zhuǎn)化成字符串dc.TextOut(4OO,3OO,SCORE);}else{SCORE.Format(L"最終得分:%d!!!你很棒哦?。?”,Score);II轉(zhuǎn)化成字符串dc.TextOut(4OO,3OO,SCORE);}KillTimer(l);}4.4相撞產(chǎn)生爆炸效果(以我方導(dǎo)彈和敵機(jī)相撞為例)for(pos=listBall.GetHeadPosition();pos!=NULL;) II敵機(jī)子彈{lastpos=pos;CBall*pBall=(CBall*)listBall.GetNext(pos);CRectrect2;II求矩形交集,即是否相撞if(rect2.IntersectRect(pBall->GetRect(),plane.GetRect())){ Life-=1;II敵機(jī)子彈擊中我機(jī),添加爆炸效果listExplosion.AddTail( newCExplosion(plane.GetRect().left,plane.GetRect().top)); II爆炸效果listBall.RemoveAt(lastpos);deletepBall;}elseif(pBall->GetPoint().y<-9||pBall->GetPoint().y>rect.Height()){listBall.RemoveAt(lastpos);deletepBall;}else{pBall->Draw(&dc,TRUE);}}boolflag=false;//標(biāo)記導(dǎo)彈是否擊中敵機(jī),true為擊中for(pos=listBomb.GetHeadPosition();pos!=NULL;) //我方導(dǎo)彈{flag=false;lastpos=pos;CBomb*pBomb=(CBomb*)listBomb.GetNext(pos);POSITIONpos1,lastpos1;for(pos1=listEnemy.GetHeadPosition();pos1!=NULL;){lastpos仁pos1;CEnemy*penemy=(CEnemy*)listEnemy.GetNext(pos1);CRectrect3; //求矩形交集,即是否相撞if(rect3.lntersectRect(pBomb->GetRect(),penemy->GetRect())){Score+=10;//我方導(dǎo)彈與敵機(jī)相撞了,添加爆炸效果listExplosion.AddTail( newCExplosion(pBomb->GetRect().left,pBomb->GetRect().top)); //爆炸效果listEnemy.RemoveAt(lastpos1);deletepenemy;//刪除敵機(jī)listBomb.RemoveAt(lastpos);deletepBomb;II刪除導(dǎo)彈break;flag=true;}elseif(pBomb->GetPoint().y<-21||pBomb->GetPoint().y>rect.Height()){listBomb.RemoveAt(lastpos);deletepBomb;break;}else{pBomb->Draw(&dc,TRUE);}}if(flag)break;}實(shí)訓(xùn)中遇到的主要問題及解決方法5.1問題:閃屏解決方案:雙緩沖技術(shù)CDC*pDC=GetDC();CRectrect;GetClientRect(&rect);CDCdc;//定義新的設(shè)置上下文對(duì)象,下一步繪圖就在這里CBitmapbitmap;//定義新的位置,實(shí)際是一塊緩沖區(qū)dc.CreateCompatibleDC(NULL);//創(chuàng)建新的DCbitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height()); //創(chuàng)建與當(dāng)前設(shè)備匹配的位圖,分配緩沖區(qū)空間CBitmap*pOldBit=dc.SelectObject(&bitmap);pDC->BitBlt(O,O,rect.Width(),rect.Height(),&dc,O,O,SRCCOPY); //調(diào)用原系統(tǒng)DC的BitBlt方法,將新緩沖區(qū)的內(nèi)容以 SRCCOPY原拷貝)模式復(fù)制給原系統(tǒng)DC,此時(shí),圖形將出現(xiàn)在屏幕上bitmap.DeleteObject(); //刪除位圖,釋放空間dc.DeleteDC();//刪除dc,釋放空間ReleaseDC(pDC);5.2問題:鍵盤控制時(shí)出現(xiàn)陰影解決方案:鍵盤控制時(shí)消除虛影,及實(shí)現(xiàn)刷屏GetClientRect(rect);dc.Rectangle(rect);5.3問題:鍵盤控制時(shí)按鍵一下一直移動(dòng)解決方案:使用OnKeyUp函數(shù)voidCtext3View::OnKeyUp(UINTnChar,UINTnRepCnt,UINTnFlags){IITODO:在此添加消息處理程序代碼和 /或調(diào)用默認(rèn)值switch(nChar){caseVK_LEFT:plane.SetHorMotion(0);break;caseVK_RIGHT:plane.SetHorMotion(0);break;

caseVK_UP:plane.SetVerMotion(0);break;caseVK_DOWN:plane.SetVerMotion(0);break;}5.4問題:按鍵停頓解決方案:將按鍵控制放在OnTimer函數(shù)里voidCtext3View::OnTimer(UINT_PTRnIDEvent){if(GetKeyState(VK_LEFT)&0x80){if(plane.GetPoint().x<=0)plane.SetHorMotion(0);elseplane.SetHorMotion(-1);}if(GetKeyState(VK_RIGHT)&0x80){if(plane.GetPoint().x+50>=rect.Width())plane.SetHorMotion(0);elseplane.SetHorMotion(1);}if(GetKeyState(VK_UP)&0x80){if(plane.GetPoint().y<=0)plane.SetVerMotion(0);elseplane.SetVerMotion(-1);}if(GetKeyState(VK_DOWN)&0x80){if(plane.GetPoint().y+60>=rect.Height())plane.SetVerMotion(0);elseplane.SetVerMotion(1);}if(GetKeyState(VK_SPACE)&0x80){listBomb.AddTail( newCBomb(plane.GetPoint().x,plane.GetPoint().y+20));listBomb.AddTail(listBomb.AddTail(listBomb.AddTail(listBomb.AddTail(CBomb(plane.GetPoint().x+40,plane.GetPoint().y+20));}}5.5問題:程序中斷問題解決方案:在我機(jī)導(dǎo)彈與敵機(jī)相撞代碼中加入標(biāo)識(shí)符,防止指針懸空。bo

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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)論