游戏编程课程设计软件工程飞机打怪兽小游戏.docx
《游戏编程课程设计软件工程飞机打怪兽小游戏.docx》由会员分享,可在线阅读,更多相关《游戏编程课程设计软件工程飞机打怪兽小游戏.docx(19页珍藏版)》请在冰点文库上搜索。
![游戏编程课程设计软件工程飞机打怪兽小游戏.docx](https://file1.bingdoc.com/fileroot1/2023-6/15/8928c863-d0ec-40b1-a37c-05449d4b1fc1/8928c863-d0ec-40b1-a37c-05449d4b1fc11.gif)
游戏编程课程设计软件工程飞机打怪兽小游戏
成绩
南京工程学院
游戏编程基础课程
综合作业说明书
题目“飞机打怪兽”游戏设计
班级软件工程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(nowXnowX=x;
}
if(nowY{
nowY+=10;
if(nowY>y)
nowY=y;
}
else
{
nowY-=10;
if(nowYnowY=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分):
得分:
教师签名:
______
日期: