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

下載本文檔

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

文檔簡介

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

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

3、INSTANCE,int) 目的:保存實(shí)例句柄并創(chuàng)建主窗口注釋:在此函數(shù)中,我們?cè)谌肿兞恐斜4鎸?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è)定飛機(jī)貼圖坐標(biāo)4.在窗口結(jié)束時(shí)恢復(fù)鼠標(biāo)移動(dòng)區(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è)計(jì)步驟說明1 開發(fā)環(huán)境配置采用Microsoft Visual Studio 2013開發(fā),使用VC+語言,可在Win7、Win8、Win10上運(yùn)行,兼容WinXP;頭文件如下圖所示:路徑配置如下圖所示:其余配置均為默認(rèn)環(huán)境。2 全局以及局部的各種變量說明/ 全局變量: HINSTANCE hInst;/ 當(dāng)前實(shí)例TCHAR szTitleMAX_LOADSTRING;/ 標(biāo)題欄文本

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

7、d數(shù)組用于存放怪獸數(shù)量/pt鼠標(biāo)光標(biāo)位置,lt、rb用于限制鼠標(biāo)光標(biāo)移動(dòng)區(qū)域?yàn)榇翱趦?nèi)部/(取得窗口內(nèi)部區(qū)域并進(jìn)行屏幕坐標(biāo)轉(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è)定飛機(jī)坐標(biāo)并進(jìn)行貼圖;設(shè)定所有子彈坐標(biāo)并進(jìn)行貼圖;設(shè)定隨機(jī)生成怪獸的坐標(biāo)并進(jìn)行貼圖;顯示真正的鼠標(biāo)光標(biāo)所在位置;2、 自定義子彈數(shù)組和怪獸數(shù)組,用于:設(shè)定子彈和怪獸的坐標(biāo)以及判斷子彈和怪獸是否存在,設(shè)定子彈和怪獸數(shù)組最大值為30,當(dāng)存在且數(shù)值小于30時(shí)計(jì)數(shù)加一,當(dāng)存在且坐標(biāo)越過游戲界面窗口邊界時(shí)計(jì)數(shù)減一,同時(shí)存在的布爾型變?yōu)閒alse。/定義子彈結(jié)構(gòu)體,x,y代表坐標(biāo),exist代表子彈是否存在struct BULLETint x, y;bool exist;/定義怪物結(jié)構(gòu)體,

9、x,y代表坐標(biāo),exist代表怪物是否存在struct KLBIRDint x, y;bool exist;BULLET b30; /聲明一個(gè)bullet數(shù)組用于存放飛機(jī)發(fā)出的子彈KLBIRD k30; /聲明一個(gè)klbird數(shù)組用于存放怪獸數(shù)量4 實(shí)現(xiàn)功能的關(guān)鍵代碼及代碼含義代碼A對(duì)飛機(jī)、子彈、怪獸的坐標(biāo)進(jìn)行設(shè)定與貼圖;判斷子彈是否打中怪獸、飛機(jī)是否撞到怪獸(分別通過對(duì)兩者的坐標(biāo)范圍的判斷而實(shí)現(xiàn)效果,代碼詳見下面)/*自定義繪圖函數(shù)*/ 1.設(shè)定飛機(jī)坐標(biāo)并進(jìn)行貼圖/ 2.設(shè)定所有子彈坐標(biāo)并進(jìn)行貼圖/ 3.設(shè)定隨機(jī)生成怪獸的坐標(biāo)并進(jìn)行貼圖/ 4.顯示真正的鼠標(biāo)光標(biāo)所在位置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);/計(jì)算飛機(jī)的貼圖坐標(biāo),每次貼圖,飛機(jī)會(huì)以10個(gè)單位向當(dāng)前鼠標(biāo)位置靠近,直到位置相同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;/貼上飛機(jī)圖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;/如果怪物碰到飛機(jī),則游戲結(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è)定下次怪物的坐標(biāo),出現(xiàn)后向右移動(dòng),所以x方向遞增ku.x += 5;/怪物超出區(qū)域則視為不存在,計(jì)數(shù)減一if (ku.x > 530)klcount-;ku.exist = false;/子彈貼圖,先判斷子彈數(shù)是否為0,不為0則對(duì)子彈數(shù)組中各個(gè)還存在的子彈按其坐標(biāo)(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è)定下次子彈的坐標(biāo),向左發(fā)射,所以x方向遞減bi.x -= 10;/子彈超出區(qū)域及視為不存在,計(jì)數(shù)減一if (bi.x < 0)bcount-;bi.exist = false;/顯示當(dāng)前鼠標(biāo)坐標(biāo),即飛機(jī)移動(dòng)的目的地wsprintf(str, L"X坐標(biāo)%d ", x);TextOut(mdc, 0, 0, str, wcslen(str);wsprintf(str, L"Y坐標(biāo)%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 : 標(biāo)準(zhǔn)系統(tǒng)包含文件的包含文件,/ 或是經(jīng)常使用但不常更改的/ 特定于項(xiàng)目的包含文件/#pragma once#include "targetver.h"

17、#define WIN32_LEAN_AND_MEAN / 從 Windows 頭文件中排除極少使用的信息/ Windows 頭文件: #include <windows.h>#include<mmsystem.h>/ C 運(yùn)行時(shí)頭文件#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: 在此處引用程序需要的其他頭文件然后在主文件中添加以下代碼加入背景音樂并實(shí)現(xiàn)要求效果:PlaySound(L"樹林.wav", NULL, SND_FILENAME | SND_ASYNC | SND_LOOP); /循環(huán)播放背景音樂 添加在代碼段hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_EX12_3);的下面四、 運(yùn)行結(jié)果及操作方法運(yùn)行結(jié)果如圖所示,打開游戲運(yùn)行界面如圖一所示,開始游戲界面如圖二所示:

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

溫馨提示

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