游戏编程课程设计软件工程飞机打怪兽小游戏.docx
- 文档编号:7542672
- 上传时间:2023-01-24
- 格式:DOCX
- 页数:17
- 大小:1.82MB
游戏编程课程设计软件工程飞机打怪兽小游戏.docx
《游戏编程课程设计软件工程飞机打怪兽小游戏.docx》由会员分享,可在线阅读,更多相关《游戏编程课程设计软件工程飞机打怪兽小游戏.docx(17页珍藏版)》请在冰豆网上搜索。
游戏编程课程设计软件工程飞机打怪兽小游戏
成绩
南京工程学院
游戏编程基础课程
综合作业说明书
题目“飞机打怪兽”游戏设计
班级软件工程xxx
学生姓名xxxxxx
学号*****xxxx
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)用于:
设定飞机坐标并进行贴图;
设定所有子弹坐标并进行贴图;
设定随机生成怪兽的坐标并进行贴图;
显示真正的鼠标光标所在位置;
二、自定义子弹数组和怪兽数组,用于:
设定子弹和怪兽的坐标以及判断子弹和怪兽是否存在,设定子弹和怪兽数组最大值为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分): 得分: 教师签名: ______ 日期:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 游戏 编程 课程设计 软件工程 飞机 怪兽 小游戏