游戲編程課程設(shè)計-軟件工程-飛機打怪獸小游戲_第1頁
游戲編程課程設(shè)計-軟件工程-飛機打怪獸小游戲_第2頁
游戲編程課程設(shè)計-軟件工程-飛機打怪獸小游戲_第3頁
游戲編程課程設(shè)計-軟件工程-飛機打怪獸小游戲_第4頁
游戲編程課程設(shè)計-軟件工程-飛機打怪獸小游戲_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、成績 南京工程學院游戲編程基礎(chǔ)課程綜合作業(yè)說明書題 目 “飛機打怪獸 ” 游戲設(shè)計 班 級 軟件工程xxx 學 生 姓 名 xxxxxx 學 號 20214xxxx 2016 年 12 月 9 日一、 程序功能與設(shè)計思路1 游戲?qū)崿F(xiàn)功能說明:² 打開游戲即自動循環(huán)播放背景音樂;² 游戲背景圖片實時移動;² 進入游戲界面后點擊鼠標左鍵即開始游戲;² 通過鼠標的移動控制飛機的飛行方向和位置;² 點擊鼠標左鍵飛機發(fā)射子彈,飛機子彈與怪獸相撞后兩者一起消失;² 怪獸撞到飛機則游戲結(jié)束,彈出窗口提示,確定后關(guān)閉游戲;² 按ESC鍵隨時

2、退出游戲。2 界面效果描述或顯示截圖:游戲界面窗口左上角顯示飛機的實時坐標;怪獸從游戲界面窗口左側(cè)隨機出現(xiàn),x坐標等于10,y坐標為0380中的隨機數(shù);飛機子彈打中怪獸,怪獸與子彈同時消失;飛機撞到怪獸,飛機與怪獸同時消失,游戲結(jié)束。3主界面設(shè)計思路創(chuàng)建一個窗口后,貼一個空白的位圖,然后分別將背景圖、飛機圖、子彈圖和怪物圖重疊貼在空白的位圖之上,形成視覺上的主界面。·二、 相關(guān)原理知識介紹 a. 游戲中子彈數(shù)目和怪獸數(shù)量分別用兩個數(shù)組:來進行表示,同一時刻屏幕中子彈和怪獸數(shù)目最大為30;b. 函數(shù):MyRegisterClass() 目的:注冊窗口類函數(shù):InitInstance(H

3、INSTANCE,int) 目的:保存實例句柄并創(chuàng)建主窗口注釋:在此函數(shù)中,我們在全局變量中保存實例句柄并創(chuàng)建和顯示主程序窗口函數(shù):WndProc(HWND, UINT, WPARAM, LPARAM) 目的:處理主窗口的消息WM_COMMAND - 處理應(yīng)用程序菜單WM_PAINT - 繪制主窗口WM_DESTROY - 發(fā)送退出消息并返回消息處理函數(shù):1.處理WM_LBUTTONDOWM消息發(fā)射子彈2.處理WM_RBUTTONDOWM消息生成怪獸3.處理WM_MOUSEMOVE消息設(shè)定飛機貼圖坐標4.在窗口結(jié)束時恢復(fù)鼠標移動區(qū)域C. 主消息循環(huán)與游戲循環(huán)/ 主消息循環(huán): /* while

4、(GetMessage(&msg, NULL, 0, 0)if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)TranslateMessage(&msg);DispatchMessage(&msg);*/游戲循環(huán)msg.message = WM_NULL;while (msg.message != WM_QUIT)if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)TranslateMessage(&msg);DispatchMessage(&ms

5、g);elsetNow = GetTickCount();if (tNow - tPre >= 40)MyPaint(hdc);return (int) msg.wParam; d. 函數(shù)列表截圖: 三、 設(shè)計步驟說明1 開發(fā)環(huán)境配置采用Microsoft Visual Studio 2013開發(fā),使用VC+語言,可在Win7、Win8、Win10上運行,兼容WinXP;頭文件如下圖所示:路徑配置如下圖所示:其余配置均為默認環(huán)境。2 全局以及局部的各種變量說明/ 全局變量: HINSTANCE hInst;/ 當前實例TCHAR szTitleMAX_LOADSTRING;/ 標題欄文本

6、TCHAR szWindowClassMAX_LOADSTRING;/ 主窗口類名/+HBITMAP bg, ship, bullet, klbird, bmp;/背景、飛機、子彈位圖HDChdc, mdc, bufdc;HWNDhWnd;DWORDtPre, tNow;intx, y, nowX, nowY;/x,y是鼠標光標位置,nowX,nowY是飛機的貼圖坐標intw = 0, bcount, klcount; /w滾動背景需要剪裁的區(qū)域?qū)挾?,bcount飛機當前的子彈數(shù)BULLET b30; /聲明一個bullet數(shù)組用于存放飛機發(fā)出的子彈KLBIRD k30; /聲明一個klbir

7、d數(shù)組用于存放怪獸數(shù)量/pt鼠標光標位置,lt、rb用于限制鼠標光標移動區(qū)域為窗口內(nèi)部/(取得窗口內(nèi)部區(qū)域并進行屏幕坐標轉(zhuǎn)換)POINT pt, lt, rb;RECT rect;/ 此代碼模塊中包含的函數(shù)的前向聲明: ATOMMyRegisterClass(HINSTANCE hInstance);BOOLInitInstance(HINSTANCE, int);LRESULT CALLBACKWndProc(HWND, UINT, WPARAM, LPARAM);INT_PTR CALLBACKAbout(HWND, UINT, WPARAM, LPARAM);/自定義繪制函數(shù)voidMy

8、Paint(HDC hdc);3自定義類及其成員函數(shù)的說明一、自定義繪圖函數(shù)MyPaint(HDC hdc) 用于:設(shè)定飛機坐標并進行貼圖;設(shè)定所有子彈坐標并進行貼圖;設(shè)定隨機生成怪獸的坐標并進行貼圖;顯示真正的鼠標光標所在位置;2、 自定義子彈數(shù)組和怪獸數(shù)組,用于:設(shè)定子彈和怪獸的坐標以及判斷子彈和怪獸是否存在,設(shè)定子彈和怪獸數(shù)組最大值為30,當存在且數(shù)值小于30時計數(shù)加一,當存在且坐標越過游戲界面窗口邊界時計數(shù)減一,同時存在的布爾型變?yōu)閒alse。/定義子彈結(jié)構(gòu)體,x,y代表坐標,exist代表子彈是否存在struct BULLETint x, y;bool exist;/定義怪物結(jié)構(gòu)體,

9、x,y代表坐標,exist代表怪物是否存在struct KLBIRDint x, y;bool exist;BULLET b30; /聲明一個bullet數(shù)組用于存放飛機發(fā)出的子彈KLBIRD k30; /聲明一個klbird數(shù)組用于存放怪獸數(shù)量4 實現(xiàn)功能的關(guān)鍵代碼及代碼含義代碼A對飛機、子彈、怪獸的坐標進行設(shè)定與貼圖;判斷子彈是否打中怪獸、飛機是否撞到怪獸(分別通過對兩者的坐標范圍的判斷而實現(xiàn)效果,代碼詳見下面)/*自定義繪圖函數(shù)*/ 1.設(shè)定飛機坐標并進行貼圖/ 2.設(shè)定所有子彈坐標并進行貼圖/ 3.設(shè)定隨機生成怪獸的坐標并進行貼圖/ 4.顯示真正的鼠標光標所在位置void MyPain

10、t(HDC hdc)TCHAR str20 = L""int i;/貼上背景圖SelectObject(bufdc, bg);BitBlt(mdc, 0, 0, w, 480, bufdc, 640 - w, 0, SRCCOPY);BitBlt(mdc, w, 0, 640 - w, 480, bufdc, 0, 0, SRCCOPY);/計算飛機的貼圖坐標,每次貼圖,飛機會以10個單位向當前鼠標位置靠近,直到位置相同if (nowX < x)nowX += 10;if (nowX > x)nowX = x;elsenowX -= 10;if (nowX &l

11、t; x)nowX = x;if (nowY < y)nowY += 10;if (nowY > y)nowY = y;elsenowY -= 10;if (nowY < y)nowY = y;/貼上飛機圖SelectObject(bufdc, ship);BitBlt(mdc, nowX, nowY, 100, 74, bufdc, 0, 74, SRCAND);BitBlt(mdc, nowX, nowY, 100, 74, bufdc, 0, 0, SRCPAINT);/如果子彈打中怪物,則怪物與子彈消失for (int i = 0; i < 30; i+)for

12、 (int u = 0; u < 30;u+) if (bi.x >= ku.x && bi.x <= ku.x + 60 && bi.y >= ku.y && bi.y <= ku.y + 60)bi.exist = false;ku.exist = false;/如果怪物碰到飛機,則游戲結(jié)束,彈出窗口for (int u = 0; u < 30; u+)if (ku.x >= nowX && ku.x <= nowX + 45 && ku.y >= nowY

13、 && ku.y <= nowY + 45)MessageBox(NULL, TEXT("游戲結(jié)束"), TEXT("Game Over"), NULL);/彈出窗口“Game Over”,提示游戲結(jié)束ku.exist = false;PostQuitMessage(0);/響應(yīng)確定按鈕后退出游戲/貼上怪物圖SelectObject(bufdc, klbird);if (klcount != 0)for (int u = 0; u<30; u+)if (ku.exist)BitBlt(mdc, ku.x, ku.y, 40,

14、40, bufdc, 0, 0, SRCCOPY);/設(shè)定下次怪物的坐標,出現(xiàn)后向右移動,所以x方向遞增ku.x += 5;/怪物超出區(qū)域則視為不存在,計數(shù)減一if (ku.x > 530)klcount-;ku.exist = false;/子彈貼圖,先判斷子彈數(shù)是否為0,不為0則對子彈數(shù)組中各個還存在的子彈按其坐標(bi.x,bi.y)循環(huán)貼圖操作SelectObject(bufdc, bullet);if (bcount != 0)for (i = 0; i<30; i+)if (bi.exist)/貼上子彈圖BitBlt(mdc, bi.x, bi.y, 10, 10, b

15、ufdc, 0, 10, SRCAND);BitBlt(mdc, bi.x, bi.y, 10, 10, bufdc, 0, 0, SRCPAINT);/設(shè)定下次子彈的坐標,向左發(fā)射,所以x方向遞減bi.x -= 10;/子彈超出區(qū)域及視為不存在,計數(shù)減一if (bi.x < 0)bcount-;bi.exist = false;/顯示當前鼠標坐標,即飛機移動的目的地wsprintf(str, L"X坐標%d ", x);TextOut(mdc, 0, 0, str, wcslen(str);wsprintf(str, L"Y坐標%d ", y);

16、TextOut(mdc, 0, 20, str, wcslen(str);BitBlt(hdc, 0, 0, 640, 480, mdc, 0, 0, SRCCOPY);tPre = GetTickCount();w += 10;if (w = 640)w = 0;代碼B設(shè)置背景音樂,游戲開始播放,播放完畢循環(huán)播放,直至游戲退出停止播放首先在stdafx.h頭文件中添加如下代碼以定義PlaySound/ stdafx.h : 標準系統(tǒng)包含文件的包含文件,/ 或是經(jīng)常使用但不常更改的/ 特定于項目的包含文件/#pragma once#include "targetver.h"

17、#define WIN32_LEAN_AND_MEAN / 從 Windows 頭文件中排除極少使用的信息/ Windows 頭文件: #include <windows.h>#include<mmsystem.h>/ C 運行時頭文件#include <stdlib.h>#include <malloc.h>#include <memory.h>#include <tchar.h>#pragma comment(lib,"winmm.lib")#include<mmsystem.h>#pr

18、agma comment(lib,"winmm.lib")/ TODO: 在此處引用程序需要的其他頭文件然后在主文件中添加以下代碼加入背景音樂并實現(xiàn)要求效果:PlaySound(L"樹林.wav", NULL, SND_FILENAME | SND_ASYNC | SND_LOOP); /循環(huán)播放背景音樂 添加在代碼段hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_EX12_3);的下面四、 運行結(jié)果及操作方法運行結(jié)果如圖所示,打開游戲運行界面如圖一所示,開始游戲界面如圖二所示:

19、圖一圖二操作方法:打開EXE文件運行游戲,背景音樂自動循環(huán)播放,移動鼠標飛機跟隨鼠標移動,點擊鼠標左鍵開始游戲,發(fā)射子彈同時怪獸從窗口左側(cè)隨機生成撞向飛機,移動鼠標躲避怪獸的同時點擊鼠標左鍵發(fā)射子彈消滅怪獸,當被怪獸撞到時游戲結(jié)束。五、經(jīng)驗與總結(jié)1設(shè)計過程中遇到的難點與解決方法設(shè)計過程中遇到的難點:如何判斷子彈是否打中怪獸,以及如何使被打中的怪獸和打中怪獸的子彈同時消失解決方法:子彈打中怪獸,就是子彈的坐標與怪獸的坐標相同,因為子彈與怪獸的坐標都是實時變化的,同時怪獸又有一定的“體積”(即坐標范圍),所以只要判斷子彈的坐標是否運動到怪獸的“體積”范圍之內(nèi),即可判斷子彈是否打中怪獸,從而判斷是否對怪獸和子彈進行貼圖;分別定義一個子彈數(shù)組和怪獸數(shù)組

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論