超詳細版隕石撞飛機_第1頁
超詳細版隕石撞飛機_第2頁
超詳細版隕石撞飛機_第3頁
超詳細版隕石撞飛機_第4頁
超詳細版隕石撞飛機_第5頁
已閱讀5頁,還剩25頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

項目五:隕石撞飛機

平面游戲設計第14、15、16周完成2010/06/04主講:徐永廣cs_star@163.com輔導:黃荔實驗內容安排4個基礎性實驗,1個綜合性實驗基礎回顧(6學時)+3=9

實驗項目1(A)類與對象(6學時)

實驗項目1(B)繼承與派生(3學時)+3=6實驗項目2多態(tài)性(3學時)實驗項目3小小圖書館(9學時)-3=6

實驗項目4簡單計算器(9學時)實驗項目5隕石撞飛機(12學時)-3=9項目五:隕石撞飛機一、實驗目標與要求設計一個隕石撞飛機的平面游戲:隕石不斷地向下落,飛機通過上下左右鍵移動以躲避隕石。如圖2_1所示。

圖2_1運行結果二、分析

關鍵知識點:VisualC++6.0中位圖操作,Bitmap類的應用,鍵盤響應(消息WM_KEYDOWN)處理函數(shù),定時器。初步實驗步驟分析1.在VisualC++中新建一個工程,命名為Plane。1)工程類型為:MFCAppWizard[exe]。2)在MFCAppWizard-Step1對話框中設置應用程序的類型,選擇單文檔結構,其余可以采用默認選項,建立一個單文檔工程文件,即得到一個應用程序框架文件,并在項目工作區(qū)窗口打開生成的應用程序的項目。2.添加資源:隕石位圖、飛機位圖。1)在ResourceView資源視圖選項卡中,插入或添加新的資源Resource,如圖1所示:

2)在InsertResource(插入資源)對話框中選擇Bitmap(位圖)選項,單擊New(新建)按鈕,如圖2所示:

該位圖的ID默認為IDB_BITMAP1.3)在ResourceView資源視圖選項卡中①飛機制作:雙擊IDB_BITMAP1選項,打開資源編輯器中的位圖編輯器,設計一個飛機位圖文件,如下圖所示。②隕石制作:用前面相同方法,在ResourceView資源視圖選項卡中,新建(或添加)幾個位圖,用于設計幾個(3~5個)不同的隕石位圖文件(每個隕石用一幅圖像文件),各個位圖的ID默認為IDB_BITMAP2、IDB_BITMAP3、IDB_BITMAP4、IDB_BITMAP5。3.對飛機的處理1)在PlaneView.h中添加:一個CBitmap類型的變量m_plane;兩個int類型變量mx,my表示飛機的坐標;一個繪制飛機圖形的函數(shù)voidDrawPlane();//函數(shù)原型聲明,實現(xiàn)可放在PlaneView.cpp中。voidDrawPlane(CDC*pDC);以上數(shù)據(jù)成員均為public屬性。2.位圖顯示分兩步:先將圖形加載到內存中,再將內存中的圖形顯示到屏幕上。通過,在PlaneView.cpp中自行添加一個函數(shù)來實現(xiàn)。voidCPlaneView::DrawPlane(CDC*pDC){CDCMemDC;MemDC.CreateCompatibleDC(pDC);

BITMAPbm;m_plane.GetObject(sizeof(BITMAP),&bm);

CBitmapMemBitmap;MemBitmap.CreateCompatibleBitmap(pDC,bm.bmWidth,bm.bmHeight);

CBitmap*pOldBitmap;pOldBitmap=(CBitmap*)MemDC.SelectObject(&MemBitmap);

MemDC.SelectObject(&m_plane);pDC->BitBlt(mx,my,bm.bmWidth,bm.bmHeight,&MemDC,0,0,SRCCOPY);MemDC.SelectObject(pOldBitmap);}3.修改構造函數(shù)與OnDraw函數(shù)添加代碼:構造函數(shù):

mx=100; my=100; m_plane.LoadBitmap(IDB_BITMAP1);OnDraw函數(shù):

DrawPlane(pDC);//調用繪制飛機函數(shù)4.添加鍵盤響應處理函數(shù)(OnkeyDown)添加函數(shù),使飛機能隨用戶按下的上下左右方向鍵而移動。方法:1)在菜單中選擇View->ClassWizard,選中CPlaneView類,在MessageMaps選項卡中的Messages欄目選擇WM_KEYDOWN消息,雙擊該項,系統(tǒng)自動生成onKeyDown消息處理函數(shù),如圖示:2)在PlaneView.cpp文件中,在系統(tǒng)自動產生的函數(shù)框架里添加如下所示代碼:到此,編譯鏈接運行程序得到可執(zhí)行文件Plane.exe,產生如圖示的效果,這時用上下左右箭頭就可以移動飛機了。試一試!添加的代碼 CClientDCClientDC(this); RECTrect; BITMAPbm; m_plane.GetObject(sizeof(BITMAP),&bm); rect.left=mx; rect.top=my; rect.right=rect.left+bm.bmWidth; rect.bottom=rect.top+bm.bmHeight; CBrushbrush(GetSysColor(COLOR_WINDOW));//擦去原來的飛機圖像 ClientDC.FillRect(&rect,&brush);

if(nChar==VK_UP)//按鍵盤上的向上鍵"↑" {my=my-3;} if(nChar==VK_LEFT)//按鍵盤上的向上鍵"←" {mx=mx-3;} if(nChar==VK_RIGHT)//按鍵盤上的向上鍵"→" {mx=mx+3;} if(nChar==VK_DOWN)//按鍵盤上的向上鍵"↓" {my=my+3;} DrawPlane(&ClientDC);//重新繪制飛機圖像下面開始制作下落的隕石1.制作幾張(3~5)不同的隕石位圖文件,方法同上(與制作飛機位圖文件一樣)。將這3~5塊隕石圖像的ID分別命名為:IDB_BITMAP2、IDB_BITMAP3、IDB_BITMAP4、IDB_BITMAP5、IDB_BITMAP6等等。如圖示:2.在PlaneView.h文件中添加處理隕石的數(shù)據(jù)成員與函數(shù)成員的代碼:同飛機位圖一樣,如:添加代碼//Attributespublic://聲明隕石位圖的成員變量為CBitmap類型的變量CBitmapm_stone1,m_stone2,m_stone3,m_stone4,m_stone5;//聲明隕石的坐標變量為int類型:intnstone1x,nstone1y;intnstone2x,nstone2y;intnstone3x,nstone3y;intnstone4x,nstone4y;intnstone5x,nstone5y;//Operationspublic://聲明繪制隕石的函數(shù)原型:voidDrawStone1(CDC*pDC);voidDrawStone2(CDC*pDC);voidDrawStone3(CDC*pDC);voidDrawStone4(CDC*pDC);voidDrawStone5(CDC*pDC);3.在PlaneView.cpp文件中,修改構造函數(shù)CPlaneView::CPlaneView()//添加初始化操作代碼:

nstone1x=rand()%500;//x方向隨機數(shù)0~499nstone1y=10;m_stone1.LoadBitmap(IDB_BITMAP2);nstone2x=rand()%500;//x方向隨機數(shù)0~499nstone2y=10;m_stone2.LoadBitmap(IDB_BITMAP3);nstone3x=rand()%500;//x方向隨機數(shù)0~499nstone3y=10;m_stone3.LoadBitmap(IDB_BITMAP4);nstone4x=rand()%500;//x方向隨機數(shù)0~499nstone4y=10;m_stone4.LoadBitmap(IDB_BITMAP5);nstone5x=rand()%500;//x方向隨機數(shù)0~499nstone5y=10;m_stone5.LoadBitmap(IDB_BITMAP6);4.實現(xiàn)自定義的繪制隕石的函數(shù)DrawStone1方法如下:voidCPlaneView::DrawStone1(CDC*pDC){CDCMemDC;MemDC.CreateCompatibleDC(pDC);

BITMAPbm1;m_stone1.GetObject(sizeof(BITMAP),&bm1);

CBitmapMemBitmap;MemBitmap.CreateCompatibleBitmap(pDC,bm1.bmWidth,bm1.bmHeight);

CBitmap*pOldBitmap;pOldBitmap=(CBitmap*)MemDC.SelectObject(&MemBitmap);

MemDC.SelectObject(&m_stone1);pDC->BitBlt(nstone1x,nstone1y,bm1.bmWidth,bm1.bmHeight,&MemDC,0,0,SRCCOPY);MemDC.SelectObject(pOldBitmap);}

其余函數(shù)DrawStone2、DrawStone3、DrawStone4、DrawStone5,類似如上的函數(shù)寫法。5.為了實現(xiàn)隕石的自動下落運動,需要添加定時器函數(shù)來控制。方法:1)選View|ClassWizard菜單項,在MFCClassWizard中,選擇CPlaneView類,在MessageMaps選項卡中的Messages欄目選擇WM_TIMER、WM_CREATE消息,分別雙擊該項,由系統(tǒng)自動生成該對應的消息函數(shù)。如圖示:

2)在CPlaneView類的OnTimer函數(shù)和OnCreate函數(shù)中添加相應的代碼,使隕石產生下落的效果。在OnCreate函數(shù)中添加:SetTimer(1,200,NULL);//定時器在OnTimer函數(shù)中添加: CClientDCClientDC(this); RECTClientRect; GetClientRect(&ClientRect); RECTrect1,rect2,rect3,rect4,rect5; BITMAPbm; m_stone1.GetObject(sizeof(BITMAP),&bm); CBrushbrush(GetSysColor(COLOR_WINDOW));

intn=0,ns1,ns2,ns3,ns4,ns5; n++; ns1=nstone1x+n; rect1.left=ns1-20; rect1.top=nstone1y-20; rect1.right=rect1.left+bm.bmWidth; rect1.bottom=rect1.top+bm.bmHeight;

ClientDC.FillRect(&rect1,&brush); nstone1y=nstone1y+10;//隕石1下落的速度 if(nstone1y>ClientRect.bottom) {nstone1y=0; nstone1x=rand()%ClientRect.right;//隕石落下的位置隨機產生 }

ns2=nstone2x+n; rect2.left=ns2-20; rect2.top=nstone2y-20; rect2.right=rect2.left+bm.bmWidth+10; rect2.bottom=rect2.top+bm.bmHeight+10;

ClientDC.FillRect(&rect2,&brush); nstone2y=nstone2y+13; if(nstone2y>ClientRect.bottom) {nstone2y=0; nstone2x=rand()%ClientRect.right; } ns3=nstone3x+n; rect3.left=ns3-20; rect3.top=nstone3y-20; rect3.right=rect3.left+bm.bmWidth+10; rect3.bottom=rect3.top+bm.bmHeight+10;

ClientDC.FillRect(&rect3,&brush); nstone3y=nstone3y+15; if(nstone3y>ClientRect.bottom) {nstone3y=0; nstone3x=rand()%ClientRect.right; } ns4=nstone4x+n; rect4.left=ns4-20; rect4.top=nstone4y-20; rect4.right=rect4.left+bm.bmWidth+10; rect4.bottom=rect4.top+bm.bmHeight+10;

ClientDC.FillRect(&rect4,&brush); nstone4y=nstone4y+17; if(nstone4y>ClientRect.bottom) {nstone4y=0; nstone4x=rand()%ClientRect.right; } ns5=nstone5x+n; rect5.left=ns5-20; rect5.top=nstone5y-20; rect5.right=rect5.left+bm.bmWidth+10; rect5.bottom=rect5.top+bm.bmHeight+10;

ClientDC.FillRect(&rect5,&brush); nstone5y=nstone5y+19; if(nstone5y>ClientRect.bottom) {nstone5y=0; nstone5x=rand()%ClientRect.right; } if(n>3) {n=0;} DrawStone1(&ClientDC); DrawStone2(&ClientDC); DrawStone3(&ClientDC);DrawStone4(&ClientDC);DrawStone5(&ClientDC);最后編譯連接運行,測試是否達到要求的效果。測試與練習、思考事實上,目前本程序設計,只

溫馨提示

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

評論

0/150

提交評論