游戏编程课程设计软件工程飞机打怪兽小游戏.docx

上传人:b****1 文档编号:13538262 上传时间:2023-06-15 格式:DOCX 页数:19 大小:1.82MB
下载 相关 举报
游戏编程课程设计软件工程飞机打怪兽小游戏.docx_第1页
第1页 / 共19页
游戏编程课程设计软件工程飞机打怪兽小游戏.docx_第2页
第2页 / 共19页
游戏编程课程设计软件工程飞机打怪兽小游戏.docx_第3页
第3页 / 共19页
游戏编程课程设计软件工程飞机打怪兽小游戏.docx_第4页
第4页 / 共19页
游戏编程课程设计软件工程飞机打怪兽小游戏.docx_第5页
第5页 / 共19页
游戏编程课程设计软件工程飞机打怪兽小游戏.docx_第6页
第6页 / 共19页
游戏编程课程设计软件工程飞机打怪兽小游戏.docx_第7页
第7页 / 共19页
游戏编程课程设计软件工程飞机打怪兽小游戏.docx_第8页
第8页 / 共19页
游戏编程课程设计软件工程飞机打怪兽小游戏.docx_第9页
第9页 / 共19页
游戏编程课程设计软件工程飞机打怪兽小游戏.docx_第10页
第10页 / 共19页
游戏编程课程设计软件工程飞机打怪兽小游戏.docx_第11页
第11页 / 共19页
游戏编程课程设计软件工程飞机打怪兽小游戏.docx_第12页
第12页 / 共19页
游戏编程课程设计软件工程飞机打怪兽小游戏.docx_第13页
第13页 / 共19页
游戏编程课程设计软件工程飞机打怪兽小游戏.docx_第14页
第14页 / 共19页
游戏编程课程设计软件工程飞机打怪兽小游戏.docx_第15页
第15页 / 共19页
游戏编程课程设计软件工程飞机打怪兽小游戏.docx_第16页
第16页 / 共19页
游戏编程课程设计软件工程飞机打怪兽小游戏.docx_第17页
第17页 / 共19页
游戏编程课程设计软件工程飞机打怪兽小游戏.docx_第18页
第18页 / 共19页
游戏编程课程设计软件工程飞机打怪兽小游戏.docx_第19页
第19页 / 共19页
亲,该文档总共19页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

游戏编程课程设计软件工程飞机打怪兽小游戏.docx

《游戏编程课程设计软件工程飞机打怪兽小游戏.docx》由会员分享,可在线阅读,更多相关《游戏编程课程设计软件工程飞机打怪兽小游戏.docx(19页珍藏版)》请在冰点文库上搜索。

游戏编程课程设计软件工程飞机打怪兽小游戏.docx

游戏编程课程设计软件工程飞机打怪兽小游戏

成绩

南京工程学院

游戏编程基础课程

综合作业说明书

 

题目“飞机打怪兽”游戏设计

 

班级软件工程xxx

学生姓名xxxxxx

学号20214xxxx

 

2016年12月9日

一、程序功能与设计思路

1.游戏实现功能说明:

✧打开游戏即自动循环播放背景音乐;

✧游戏背景图片实时移动;

✧进入游戏界面后点击鼠标左键即开始游戏;

✧通过鼠标的移动控制飞机的飞行方向和位置;

✧点击鼠标左键飞机发射子弹,飞机子弹与怪兽相撞后两者一起消失;

✧怪兽撞到飞机则游戏结束,弹出窗口提示,确定后关闭游戏;

✧按ESC键随时退出游戏。

2.界面效果描述或显示截图:

游戏界面窗口左上角显示飞机的实时坐标;

怪兽从游戏界面窗口左侧随机出现,x坐标等于10,y坐标为0~380中的随机数;

飞机子弹打中怪兽,怪兽与子弹同时消失;

飞机撞到怪兽,飞机与怪兽同时消失,游戏结束。

 

3.主界面设计思路

创建一个窗口后,贴一个空白的位图,然后分别将背景图、飞机图、子弹图和怪物图重叠贴在空白的位图之上,形成视觉上的主界面。

·

二、相关原理知识介绍

a.游戏中子弹数目和怪兽数量分别用两个数组:

来进行表示,同一时刻屏幕中子弹和怪兽数目最大为30;

b.函数:

MyRegisterClass()目的:

注册窗口类

函数:

InitInstance(HINSTANCE,int)目的:

保存实例句柄并创建主窗口

注释:

在此函数中,我们在全局变量中保存实例句柄并创建和显示主程序窗口

函数:

WndProc(HWND,UINT,WPARAM,LPARAM)目的:

处理主窗口的消息

WM_COMMAND-处理应用程序菜单

WM_PAINT-绘制主窗口

WM_DESTROY-发送退出消息并返回

消息处理函数:

1.处理WM_LBUTTONDOWM消息发射子弹

2.处理WM_RBUTTONDOWM消息生成怪兽

3.处理WM_MOUSEMOVE消息设定飞机贴图坐标

4.在窗口结束时恢复鼠标移动区域

C.主消息循环与游戏循环

//主消息循环:

/*

while(GetMessage(&msg,NULL,0,0))

{

if(!

TranslateAccelerator(msg.hwnd,hAccelTable,&msg))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

}

*/

//游戏循环

msg.message=WM_NULL;

while(msg.message!

=WM_QUIT)

{

if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

else

{

tNow=GetTickCount();

if(tNow-tPre>=40)

MyPaint(hdc);

}

}

return(int)msg.wParam;

}

d.函数列表截图:

 

三、设计步骤说明

1.开发环境配置

采用MicrosoftVisualStudio2013开发,使用VC++语言,可在Win7、Win8、Win10上运行,兼容WinXP;

头文件如下图所示:

路径配置如下图所示:

其余配置均为默认环境。

2.全局以及局部的各种变量说明

//全局变量:

HINSTANCEhInst;//当前实例

TCHARszTitle[MAX_LOADSTRING];//标题栏文本

TCHARszWindowClass[MAX_LOADSTRING];//主窗口类名

//+++++++++++++++++++++++++++

HBITMAPbg,ship,bullet,klbird,bmp;//背景、飞机、子弹位图

HDChdc,mdc,bufdc;

HWNDhWnd;

DWORDtPre,tNow;

intx,y,nowX,nowY;//x,y是鼠标光标位置,nowX,nowY是飞机的贴图坐标

intw=0,bcount,klcount;//w滚动背景需要剪裁的区域宽度,bcount飞机当前的子弹数

BULLETb[30];//声明一个bullet数组用于存放飞机发出的子弹

KLBIRDk[30];//声明一个klbird数组用于存放怪兽数量

//pt鼠标光标位置,lt、rb用于限制鼠标光标移动区域为窗口内部

//(取得窗口内部区域并进行屏幕坐标转换)

POINTpt,lt,rb;

RECTrect;

 

//此代码模块中包含的函数的前向声明:

ATOMMyRegisterClass(HINSTANCEhInstance);

BOOLInitInstance(HINSTANCE,int);

LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);

INT_PTRCALLBACKAbout(HWND,UINT,WPARAM,LPARAM);

//自定义绘制函数

voidMyPaint(HDChdc);

 

3.自定义类及其成员函数的说明

一、自定义绘图函数MyPaint(HDChdc)用于:

设定飞机坐标并进行贴图;

设定所有子弹坐标并进行贴图;

设定随机生成怪兽的坐标并进行贴图;

显示真正的鼠标光标所在位置;

2、自定义子弹数组和怪兽数组,用于:

设定子弹和怪兽的坐标以及判断子弹和怪兽是否存在,设定子弹和怪兽数组最大值为30,当存在且数值小于30时计数加一,当存在且坐标越过游戏界面窗口边界时计数减一,同时存在的布尔型变为false。

//定义子弹结构体,x,y代表坐标,exist代表子弹是否存在

structBULLET

{

intx,y;

boolexist;

};

//定义怪物结构体,x,y代表坐标,exist代表怪物是否存在

structKLBIRD

{

intx,y;

boolexist;

};

BULLETb[30];//声明一个bullet数组用于存放飞机发出的子弹

KLBIRDk[30];//声明一个klbird数组用于存放怪兽数量

4.实现功能的关键代码及代码含义

代码A

对飞机、子弹、怪兽的坐标进行设定与贴图;

判断子弹是否打中怪兽、飞机是否撞到怪兽(分别通过对两者的坐标范围的判断而实现效果,代码详见下面)

//****自定义绘图函数********************************

//1.设定飞机坐标并进行贴图

//2.设定所有子弹坐标并进行贴图

//3.设定随机生成怪兽的坐标并进行贴图

//4.显示真正的鼠标光标所在位置

voidMyPaint(HDChdc)

{

TCHARstr[20]=L"";

inti;

//贴上背景图

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

{

nowX+=10;

if(nowX>x)

nowX=x;

}

else

{

nowX-=10;

if(nowX

nowX=x;

}

if(nowY

{

nowY+=10;

if(nowY>y)

nowY=y;

}

else

{

nowY-=10;

if(nowY

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(inti=0;i<30;i++)

{

for(intu=0;u<30;u++)

{

if(b[i].x>=k[u].x&&b[i].x<=k[u].x+60&&b[i].y>=k[u].y&&b[i].y<=k[u].y+60)

{

b[i].exist=false;

k[u].exist=false;

}

}

}

//如果怪物碰到飞机,则游戏结束,弹出窗口

for(intu=0;u<30;u++)

{

if(k[u].x>=nowX&&k[u].x<=nowX+45&&k[u].y>=nowY&&k[u].y<=nowY+45)

{

MessageBox(NULL,TEXT("游戏结束"),TEXT("GameOver"),NULL);//弹出窗口“GameOver”,提示游戏结束

k[u].exist=false;

PostQuitMessage(0);//响应确定按钮后退出游戏

}

}

//贴上怪物图

SelectObject(bufdc,klbird);

if(klcount!

=0)

for(intu=0;u<30;u++)

if(k[u].exist)

{

BitBlt(mdc,k[u].x,k[u].y,40,40,bufdc,0,0,SRCCOPY);

//设定下次怪物的坐标,出现后向右移动,所以x方向递增

k[u].x+=5;

//怪物超出区域则视为不存在,计数减一

if(k[u].x>530)

{

klcount--;

k[u].exist=false;

}

}

//子弹贴图,先判断子弹数是否为0,不为0则对子弹数组中各个还存在的子弹按其坐标(b[i].x,b[i].y)循环贴图操作

SelectObject(bufdc,bullet);

if(bcount!

=0)

for(i=0;i<30;i++)

if(b[i].exist)

{

//贴上子弹图

BitBlt(mdc,b[i].x,b[i].y,10,10,bufdc,0,10,SRCAND);

BitBlt(mdc,b[i].x,b[i].y,10,10,bufdc,0,0,SRCPAINT);

//设定下次子弹的坐标,向左发射,所以x方向递减

b[i].x-=10;

//子弹超出区域及视为不存在,计数减一

if(b[i].x<0)

{

bcount--;

b[i].exist=false;

}

}

//显示当前鼠标坐标,即飞机移动的目的地

wsprintf(str,L"X坐标%d",x);

TextOut(mdc,0,0,str,wcslen(str));

wsprintf(str,L"Y坐标%d",y);

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

设置背景音乐,游戏开始播放,播放完毕循环播放,直至游戏退出停止播放

首先在stdafx.h头文件中添加如下代码以定义PlaySound

//stdafx.h:

标准系统包含文件的包含文件,

//或是经常使用但不常更改的

//特定于项目的包含文件

//

#pragmaonce

#include"targetver.h"

#defineWIN32_LEAN_AND_MEAN//从Windows头文件中排除极少使用的信息

//Windows头文件:

#include

#include

//C运行时头文件

#include

#include

#include

#include

#pragmacomment(lib,"winmm.lib")

#include

#pragmacomment(lib,"winmm.lib")

 

//TODO:

在此处引用程序需要的其他头文件

然后在主文件中添加以下代码加入背景音乐并实现要求效果:

PlaySound(L"カブラ樹林.wav",NULL,SND_FILENAME|SND_ASYNC|SND_LOOP);//循环播放背景音乐

添加在代码段hAccelTable=LoadAccelerators(hInstance,MAKEINTRESOURCE(IDC_EX12_3));

的下面

四、运行结果及操作方法

运行结果如图所示,打开游戏运行界面如图一所示,开始游戏界面如图二所示:

图一

图二

操作方法:

打开EXE文件运行游戏,背景音乐自动循环播放,移动鼠标飞机跟随鼠标移动,点击鼠标左键开始游戏,发射子弹同时怪兽从窗口左侧随机生成撞向飞机,移动鼠标躲避怪兽的同时点击鼠标左键发射子弹消灭怪兽,当被怪兽撞到时游戏结束。

五、经验与总结

1.设计过程中遇到的难点与解决方法

设计过程中遇到的难点:

如何判断子弹是否打中怪兽,以及如何使被打中的怪兽和打中怪兽的子弹同时消失

解决方法:

子弹打中怪兽,就是子弹的坐标与怪兽的坐标相同,因为子弹与怪兽的坐标都是实时变化的,同时怪兽又有一定的“体积”(即坐标范围),所以只要判断子弹的坐标是否运动到怪兽的“体积”范围之内,即可判断子弹是否打中怪兽,从而判断是否对怪兽和子弹进行贴图;分别定义一个子弹数组和怪兽数组,在子弹结构体和怪兽结构体中设置一个布尔量exist,当子弹打中怪兽时,使子弹和怪兽的exist值均变为false,则子弹与怪兽同时消失。

2.调试过程中的各种错误与解决方法

错误一:

第一颗子弹只能打中第一个出现的怪兽,其余怪兽无法击中

解决方法:

子弹数组的变量b[i]与怪兽数组的变量k[i]使用了同一个参数所致,将怪兽数组变量k[i]参数i变为u,即k[u],u的变化与i的变化完全相同,使用for的双重嵌套完成。

即for(inti=0;i<30;i++){for(intu=0;u<30;u++){}}模式。

错误二:

怪兽总是一起生成出现,一起消失

解决方法:

设置一个怪兽数组,来判断怪兽的生成存在与消失,而不是给怪兽一个固定坐标后再使怪兽运动。

3.改进与拓展

改进一:

通过在stdafx.h头文件中添加代码路径添加库,定义PlaySound函数,然后在主函数.cpp中实现背景音乐与循环播放;

改进二:

一开始飞机运动,但是背景图片是固定不变的,后来通过定义w表示滚动背景需要剪裁的区域宽度,在贴图时使背景图片坐标不断被裁剪从而实现背景图片的变化,通过物理现象中的相对运动更生动形象的实现飞机的运动。

教师评分:

 

1.工作态度与整体表现(10分):

得分:

2.动手能力

——正常运行(10分):

得分:

——验收说明及调试能力(30分):

得分:

3.创新能力(10分):

得分:

4.报告质量

——报告格式(10分):

得分:

——报告内容完整性(30分):

得分:

 

教师签名:

______

日期:

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 临时分类 > 批量上传

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2