飞机大战实训报告Word文档格式.docx
- 文档编号:19931442
- 上传时间:2023-01-12
- 格式:DOCX
- 页数:16
- 大小:54.84KB
飞机大战实训报告Word文档格式.docx
《飞机大战实训报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《飞机大战实训报告Word文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
只有当我机位于敌机下方时,敌机才会产生子弹,默认情况下是不发射任何子弹的。
(3)战机子弹打中敌机,敌机就会爆炸,同时玩家分数会增加,每得1000分进入下一关。
2.相关技术
在设计该游戏时,用到许多技术,这里介绍几个相对重要的技术。
2.1关于碰撞检测的相关函数
用CRect类的GetRect()函数可以获得当前对象的矩形区域,IntersectRect()并用此函数判断战机与敌机,子弹与战机,我方导弹与敌机,战机与物品是否相撞。
2.2CObList链表
使用CObList链表来分别存储敌机,炸弹,导弹,爆炸效果。
CobList类似于一个双向链表,POSITION类型的变量为链表的键。
使用POSITION变量,既可以作为链表循环中的循环变量,也可以作为标记某个位置的标签。
我们可以通过获得某元素的POSITION来访问它。
本程序中主要用到的函数有:
GetHeadPosition()——获取链表首元素的POSITION;
AddTail()——向链表尾部添加新的元素;
GetNext(POSITION&
rPosition)——返回当前rPosition指向的元素,并使rPosition指向下一个元素。
2.3设置定时器、销毁定时器
SetTimer()函数来设置定时器,控制每隔多少毫秒执行一次什么任务。
用KillTime()函数来销毁定时器。
2.4双缓冲技术
为了避免窗体频繁闪烁,引入双缓冲技术。
双缓冲的原理是先建立一个内存DC,将游戏对象绘制到内存DC上,再一次性的把内存中绘制好的图形“拷贝”到设备DC上。
采取这种方法可以提高绘图速度,极大的改善绘图效果。
3.总体设计与详细设计
3.1系统模块划分
有两个主要的部分组成,分别是规则子系统、游戏对象子系统。
3.1.1规则子系统
该子系统主要是实现飞机大战各项游戏规则。
实现了需求中的游戏规则。
这个系统模块实现了敌机对战机的攻击、以及游戏对象碰撞检测规则。
✧攻击规则
⏹敌机在战机上方时发射炸弹,炸弹从上至下射向战机
✧碰撞规则
⏹战机所在矩形区域与奖品所在矩形区域相交时,表示战机获得该奖励。
⏹导弹或炸弹本身的矩形区域和敌机或战机的矩形区域相交时,表示导弹或炸弹射中了敌机或战机。
⏹敌机击中战机,战机血量减少。
⏹战机击中敌机,敌机被炸毁,战机得分增加。
⏹战机血量为0,游戏结束。
3.1.2游戏对象子系统
该子系统包含了各个游戏对象的实现。
✧应用程序对象
●游戏程序的加载
●游戏对象的绘制
●游戏规则的调用
●玩家的键盘事件获取
✧游戏对象
●敌机绘图
●战机绘图
●子弹绘图
●爆炸效果绘图
类体系如下:
主要有CMyPlane:
战机,CEnemy:
敌机,CIenemy:
敌机boss,CBall:
炮弹,
CBobm:
导弹,CExplossion:
爆炸效果,CHeart:
红心(吃了可以加血)。
3.2主要功能模块
主要功能模块主要就是那些类的功能模块,主要有:
1、各个游戏对象的贴图模块
2、敌机数量、方向、速度以及子弹的数量、方向和速度控制模块。
3、战机的导弹的数目、方向和速度控制模块。
4、战机的键盘控制位置模块。
5、敌机、子弹和战机、导弹的碰撞检测以及爆炸模块。
6、背景添加模块。
7、战机速度控制模块。
8、游戏关卡和游戏难易度。
9、游戏得分和生命值控制以及游戏结束。
10、游戏音效控制模块。
4.编码实现
由于编写了多个类来实现该游戏功能,所以程序较多,这里只展示核心部分。
程序如下:
4.1游戏初始化
voidCPlaneGameView:
:
OnInitialUpdate()
{
CView:
OnInitialUpdate();
//TODO:
在此添加专用代码和/或调用基类
//初始化游戏
m_pDC=newCClientDC(this);
m_pMemDC=newCDC;
m_pMemDC->
CreateCompatibleDC(m_pDC);
m_pMemBitmap=newCBitmap;
//建立内存位图
CRectck;
this->
GetClientRect(&
ck);
m_pMemBitmap->
CreateCompatibleBitmap(m_pDC,ck.Width(),ck.Height());
SelectObject(m_pMemBitmap);
//将位图选入内存DC
CRectrc;
GetClientRect(rc);
//产生随机数种子
srand((unsigned)time(NULL));
//建立设备DC
m_pDC=newCClientDC(this);
//建立内存DC
m_pMemDC=newCDC;
//建立内存位图
m_pMemBitmap=newCBitmap;
CreateCompatibleBitmap(m_pDC,GAME_WIDTH,GAME_HEIGHT);
//将位图选入内存DC
CMyPlane:
LoadImage();
CEnemy:
CBomb:
CBall:
CExplosion:
CHeart:
CIenemy:
//产生主我方战机
m_pMe=newCMyPlane;
//启动游戏
SetTimer(1,30,NULL);
SetTimer(2,240,NULL);
}
4.2设置动态背景
CBitmapbmp;
bmp.LoadBitmapW(IDB_Background);
//创建位图
SelectObject(&
bmp);
pMemDC->
BitBlt(0,0,800,600,m_pMemDC,0,imagelocation,SRCCOPY);
//设置动态背景
if(imagelocation<
0)
imagelocation=600;
imagelocation-=2;
DeleteObject(&
4.3显示文字以及绘制游戏对象
SetBkMode(TRANSPARENT);
//文字背景透明
wsprintf(lifeleft,L"
生命值:
%d"
m_pMe->
HP);
SetTextColor(RGB(255,255,0));
//字体颜色
TextOutW(10,10,lifeleft,_tcslen(lifeleft));
//字体位置
剩余命数:
life);
TextOutW(10,35,lifeleft,_tcslen(lifeleft));
wsprintf(Score,L"
得分:
score);
SetTextColor(RGB(255,0,0));
TextOutW(10,60,Score,_tcslen(Score));
wsprintf(Level,L"
第%d关"
level);
SetTextColor(RGB(255,255,255));
TextOutW(10,85,Level,_tcslen(Level));
//绘制我方战机
if(m_pMe!
=NULL)
{
m_pMe->
Draw(m_pMemDC,FALSE);
}
else
{//游戏结束提醒
CStringstr=_T("
GameOver!
"
);
pMemDC->
SetTextAlign(TA_CENTER);
SetTextColor(RGB(255,0,0));
TextOut(GAME_WIDTH/2,GAME_HEIGHT/2,str);
=NULL&
&
score>
=10000)
{//游戏胜利提醒
CStringstr=_T("
YouWin!
//绘制飞机炮弹、敌机、奖励、
for(inti=0;
i<
7;
i++)
POSITIONpos1,pos2;
for(pos1=m_ObjList[i].GetHeadPosition();
(pos2=pos1)!
=NULL;
)
{
CGameObject*pObj=(CGameObject*)m_ObjList[i].GetNext(pos1);
if(!
pObj->
Draw(pMemDC,FALSE))
{
m_ObjList[i].RemoveAt(pos2);
deletepObj;
}
}
//复制内存DC到设备DC
m_pDC->
BitBlt(0,0,GAME_WIDTH,GAME_HEIGHT,m_pMemDC,0,0,SRCCOPY);
4.4随机产生敌机
//随机产生敌机
score<
10000)//控制生成条件
{
staticintnCreator=rand()%5;
if(nCreator<
=m_pMe->
level)
nCreator=rand()%5+10;
m_ObjList[enEnemy].AddTail(newCEnemy);
nCreator--;
if(m_pMe==NULL||m_pMe->
=10000)//通关或者没有生命剩余,不再产生敌机
return;
4.5战机移动以及发射导弹
//检测四个方向键,移动战机
if(GetKey(VK_UP)==1)
m_pMe->
SetVerMotion
(1);
if(GetKey(VK_DOWN)==1)
SetVerMotion(-1);
if(GetKey(VK_RIGHT)==1)
SetHorMotion
(1);
if(GetKey(VK_LEFT)==1)
SetHorMotion(-1);
//产生战机导弹
if(GetKey(VK_SPACE)==1)//按下了空格键
CBomb
*cbo1=new
CBomb(pDoc->
m_pMe->
m_ptPos.x+10,pDoc->
m_ptPos.y,1);
pDoc->
m_ObList[Bomb].AddTail(cbo1);
*cbo2=new
m_ptPos.x+30,pDoc->
m_ObList[Bomb].AddTail(cbo2);
4.6敌机发射炮弹
//敌机发射子弹
CPointPlanePt=m_pMe->
GetPoint();
//获取我方战机方位
for(POSITIONePos=m_ObjList[enEnemy].GetHeadPosition();
ePos!
=NULL;
)
CEnemy*pEnemy=(CEnemy*)m_ObjList[enEnemy].GetNext(ePos);
if(!
pEnemy->
Fired())//如果敌机没处于发射状态,继续循环
continue;
CPointePt=pEnemy->
//获取敌方战机方位
BOOLfa=FALSE;
//标记是否发射
//敌机在战机前面
if(pEnemy->
GetMontion()==1&
ePt.y<
PlanePt.y)
fa=TRUE;
//敌机在战机后面
//if(pEnemy->
GetMontion()==-1&
ePt.y>
//fa=TRUE;
if(fa&
ePt.x>
=PlanePt.x&
ePt.x<
PlanePt.x+CMyPlane:
PLANE_WIDTH)
m_ObjList[enBall].AddTail(newCBall(ePt.x+10,ePt.y+10,pEnemy->
GetMontion()));
4.7碰撞检测及音效
//敌机子弹炸掉战机
POSITIONbPos1=NULL,bPos2=NULL;
CRectmRect=m_pMe->
GetRect();
for(bPos1=m_ObjList[enBall].GetHeadPosition();
(bPos2=bPos1)!
CBall*pBall=(CBall*)m_ObjList[enBall].GetNext(bPos1);
CRectbRect=pBall->
CRecttmpRect;
if(tmpRect.IntersectRect(&
bRect,mRect))
//删除子弹
m_ObjList[enBall].RemoveAt(bPos2);
deletepBall;
//添加爆炸效果
m_ObjList[enExplosion].AddTail(newCExplosion(mRect.left,mRect.top));
PlaySound(TEXT("
E:
/飞机大战/plane/bang.wav"
),NULL,SND_FILENAME|SND_ASYNC|SND_NOSTOP);
HP-=10;
if(m_pMe->
HP<
=0)
life--;
HP=100;
life<
//删除战机
deletem_pMe;
m_pMe=NULL;
break;
//撞机
POSITIONePos1=NULL,ePos2=NULL;
//用于记录敌我两级位置
for(ePos1=m_ObjList[enEnemy].GetHeadPosition();
(ePos2=ePos1)!
CEnemy*pEnemy=(CEnemy*)m_ObjList[enEnemy].GetNext(ePos1);
CRecteRect=pEnemy->
if(tmpRect.IntersectRect(eRect,mRect))//如果交不为空,则返回非零值;
否则,如果交为空则返回
//删除敌机
m_ObjList[enEnemy].RemoveAt(ePos2);
//从索引中删除
deletepEnemy;
PlaySound(TEXT("
HP-=20;
if(m_pMe->
m_pMe=NULL;
//还原子弹
Bkind=1;
//添加爆炸效果
m_ObjList[enExplosion].AddTail(
newCExplosion(mRect.left,mRect.top)
);
}
POSITIONbaPos1=NULL,baPos2=NULL;
for(baPos1=m_ObjList[enBallA].GetHeadPosition();
(baPos2=baPos1)!
CBallA*pBallA=(CBallA*)m_ObjList[enBallA].GetNext(baPos1);
CRectprRect=pBallA->
//战机导弹炸掉敌机
POSITIONmPos1=NULL,mPos2=NULL;
for(mPos1=m_ObjList[enBomb].GetHeadPosition();
(mPos2=mPos1)!
CBomb*pBomb=(CBomb*)m_ObjList[enBomb].GetNext(mPos1);
CRectbRect=pBomb->
POSITIONePos1=NULL,ePos2=NULL;
for(ePos1=m_ObjList[enEnemy].GetHeadPosition();
CEnemy*pEnemy=(CEnemy*)m_ObjList[enEnemy].GetNext(ePos1);
CRectmRect=pEnemy->
CRecttmpRect;
m_pMe->
score+=10;
//intx=m_pMe->
level;
if(m_pMe->
=1000*(m_pMe->
level))//&
(m_pMe->
level)%2==1
m_pMe->
level++;
//添加爆炸效果
m_ObjList[enExplosion].AddTail(newCExplosion(mRect.left,mRect.top));
PlaySound(TEXT("
//删除导弹
Bkind!
=2)
{
m_ObjList[enBomb].RemoveAt(mPos2);
deletepBomb;
}
//删除敌机
m_ObjList[enEnemy].RemoveAt(ePos2);
deletepEnemy;
break;
另外还有敌机BOSS以及大招代码:
if(nIDEvent==2)
{//敌机BOSS发射炮弹检测
POSITIONIe1=NULL,Ie2=NULL;
Ie1=m_ObjList[IenEnemy].GetHeadPosition();
while((Ie2=Ie1)!
=NULL)
CIenemy*pIenemy=(CIenemy*)m_ObjList[IenEnemy].GetNext(Ie1);
for(inti=-15;
i<
=15;
i++)
m_ObjList[Ball].AddTail(n
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 飞机 大战 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)