飞机大战实训报告

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

目录

1. 概述 (1)

2. 相关技术 (2)

2.1碰撞检测 (2)

2.2 CObList链表 (2)

2.3 设置定时器 (2)

2.4 背景滚动 (2)

2.5内存释放技术 (2)

3. 总体设计与详细设计 (2)

3.1 系统模块划分 (2)

3.2 主要功能模块 (3)

4. 编码实现 (5)

5. 实训中遇到的主要问题及解决方法 (37)

6. 实训体会 (37)

1. 概述

这次实训,目的以VS 为环境,利用MFC,使用C++语言编写一个简单的飞机大战游戏。

实现的主要功能:

1.有开始游戏界面,上下左右键控制飞机自由移动,空格键发射炮弹。

2.设有关卡,每打完一个boss就会过关,每过一关战机炮弹会升级,敌机随机发射

子弹数量增加。

3.战机起始十条命,可以通过过关和吃到道具增加血量。

4.战机子弹打中敌机,敌机就会爆炸,boss血量随关卡升高而增多,打败敌机或者

boss会有分数加成。

5.设有无敌模式和普通模式,无敌模式大招无限,生命无限,战机导弹直接升至最高

等级。

2. 相关技术

2.1碰撞检测

用CRect类的GetRect()函数可以获得当前对象的矩形区域,IntersectRect()并用此函数判断二者是否碰撞。

2.2CObList链表

这个程序使用CObList链表来存储各效果。CobList类似于一个双向链表,POSITION 类型的变量为链表的键。使用POSITION变量,既可以作为链表循环中的循环变量,也可以作为标记某个位置的标签。我们可以通过获得某元素的POSITION来访问它。

本程序中主要用到的函数有:

GetHeadPosition():获取链表首元素的POSITION;

AddTail():将新的元素添加到链表最后;

GetNext( POSITION& rPosition ):使rPosition指向下一个元素。

2.3 设置定时器

SetTimer()函数来设置定时器。

2.4 背景滚动

为了让游戏场景更加逼真,游戏节奏更加合理,可以通过让背景滚动来提高游戏的场景效应,实现这一技术时,可以将一张背景图片复制为2张,从上到下连续的拼接在一起,使其不会出现图片的卡顿和瞬移现象。

2.5内存释放技术

这个程序中有大量的地方需要使用内存,如果不及时删除会出现闪图等情况,容易导致程序崩溃,要及时释放内存资源。

3. 总体设计与详细设计

3.1 系统模块划分

3.2 主要功能模块

类关系图:

4. 编码实现

// PlaneGameView.cpp : CPlaneGameView 类的实现

void CPlaneGameView::UpdateFrame(CDC* pMemDC)

{

//绘制天空

if(level==0)

{

CPaintDC dc(this);

CBitmap bmpBackground; //位图对象

bmpBackground.LoadBitmap(IDB_BITMAP1);

CDC dcMem; //定义一个工具箱(设备上下文)

dcMem.CreateCompatibleDC(&dc);

BITMAP bitmap;

bmpBackground.GetBitmap(&bitmap); //建立绑定关系

CBitmap *back = dcMem.SelectObject(&bmpBackground); //保存原有CDC对象,并选入新CDC对象入DC

static int curr = 1;

if (curr <= 1)

curr = GAME_HEIGHT - 1;

curr -= 1;

pMemDC->BitBlt(0, 0, GAME_WIDTH, GAME_HEIGHT - curr, &dcMem, 0, curr, SRCCOPY);

pMemDC->BitBlt(0, GAME_HEIGHT - curr, GAME_WIDTH, curr, &dcMem, 0, 0, SRCCOPY);

}

if(level>=1&&l==0&&boss==0)

{

pMemDC->FillSolidRect(0, 0, GAME_WIDTH, GAME_HEIGHT, RGB(0, 0, 0));

l++;z=1;

}

if(level==1&&l!=0&&boss!=0)

{

CPaintDC dc(this);

CBitmap bmpBackground; //位图对象

bmpBackground.LoadBitmap(IDB_BITMAP1);

CDC dcMem; //定义一个工具箱(设备上下文)

dcMem.CreateCompatibleDC(&dc);

BITMAP bitmap;

bmpBackground.GetBitmap(&bitmap); //建立绑定关系

CBitmap *back = dcMem.SelectObject(&bmpBackground); //保存原有CDC对象,并选入新CDC对象入DC

static int curr = 1;

if (curr <= 1)

curr = GAME_HEIGHT - 1;

curr -= 1;

pMemDC->BitBlt(0, 0, GAME_WIDTH, GAME_HEIGHT - curr, &dcMem, 0, curr, SRCCOPY);

pMemDC->BitBlt(0, GAME_HEIGHT - curr, GAME_WIDTH, curr, &dcMem, 0, 0, SRCCOPY);

相关文档
最新文档