飞机大战实训报告

飞机大战实训报告
飞机大战实训报告

目录

1. 概述..................................................

1. 概述

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

实现的主要功能:

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

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

弹数量增加。

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

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

会有分数加成。

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

等级。

2. 相关技术

碰撞检测

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

CObList链表

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

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

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

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

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

设置定时器

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

背景滚动

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

内存释放技术

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

3. 总体设计与详细设计

系统模块划分

主要功能模块

4. 编码实现

{

{

}

}

}}

ddTail(new CEnemy);

}

nCreator--;

ddTail(new Cda);

count++;

}

ddTail(new Cshengming);

count++;

}

ddTail(new Cboss);

bxt = 1;bn++;

}

if (level == 2&&bn==0&&count>=50&&count<=52) {

m_ObjList[enboss].AddTail(new Cboss);

bxt = 1;bn++;

}

if (level == 3&&bn==0&&count>=75&&count<=77) {

m_ObjList[enboss].AddTail(new Cboss);

bxt = 1;bn++;

}

if (level == 4&&bn==0&&count>=100&&count<=102) {

m_ObjList[enboss].AddTail(new Cboss);

bxt = 1;bn++;

}

if (level == 5&&bn==0&&count>=150&&count<=152) {

m_ObjList[enboss].AddTail(new Cboss);

bxt = 1;

bn++;

}

if (level>5&&count%200==0&&bn==0)

{

m_ObjList[enboss].AddTail(new Cboss);

bxt = 1;bn++;

}

if (m_pMe == NULL)

return;

ddTail(new CBomb + 20, + 10));

}

if (level == 2 && wu == 0)

{

m_ObjList[enBomb].AddTail(new CBomb + 10, + 30));

m_ObjList[enBomb].AddTail(new CBomb + 30, + 30));

}

if (level == 3 && wu == 0)

{

m_ObjList[enBomb].AddTail(new CBomb + 10, + 30));

m_ObjList[enBomb].AddTail(new CBomb + 30, + 30));

m_ObjList[enBomb].AddTail(new CBomb + 20, + 30)); }

if (level >= 4 && wu == 0)

{

m_ObjList[enBomb].AddTail(new CBomb + 10, + 30));

m_ObjList[enBomb].AddTail(new CBomb + 30, + 30));

m_ObjList[enBomb].AddTail(new CBomb + 20, + 30));

m_ObjList[enBomb].AddTail(new CBomb , + 30));

m_ObjList[enBomb].AddTail(new CBomb + 40, + 30));

}

if (wu == 1)

{

m_ObjList[enBomb].AddTail(new CBomb + 10, + 30));

m_ObjList[enBomb].AddTail(new CBomb + 30, + 30));

m_ObjList[enBomb].AddTail(new CBomb + 20, + 30));

m_ObjList[enBomb].AddTail(new CBomb, + 30));

m_ObjList[enBomb].AddTail(new CBomb + 40, + 30));

}

}

}

if (GetKey(VK_F1) == 1)etHeadPosition(); ePos != NULL;) {

Cboss* pEnemy = (Cboss*)m_ObjList[enboss].GetNext(ePos);

CPoint ePt = pEnemy->GetPoint();

CBossball * t;

for (int i = -level + 1; i <= level - 1; i++)

{

t = new CBossball + 20, + 30);

t->zx = int*sin(* double(i)) / 9));

t->zy = int*cos(* double(i)) / 9));

m_ObjList[enBossball].AddTail(t);

}

}

num = 100;

}

num--;

etHeadPosition(); ePos != NULL;)

{

CEnemy* pEnemy = (CEnemy*)m_ObjList[enEnemy].GetNext(ePos);

if (!pEnemy->Fired())

continue;

CPoint ePt = pEnemy->GetPoint();

BOOL by = FALSE;

ddTail(t);

}

}

}

}

etHeadPosition(); (nPos4 = nPos3) != NULL;)

{

CBall* pBall = (CBall*)m_ObjList[enBossball].GetNext(nPos3);

CRect bRect = pBall->GetRect();

CRect tmpRect;

if (&bRect, mRect))

{

ddTail(

new CExplosion,

);

emoveAt(nPos4);

delete pBall;

if (shengming <= 0)

{

etHeadPosition(); (nPos2 = nPos1) != NULL;)

{

CBall* pBall = (CBall*)m_ObjList[enEnemy].GetNext(nPos1);

CRect bRect = pBall->GetRect();

CRect tmpRect;

if (&bRect, mnRect))

{

ddTail(

new CExplosion,

);

emoveAt(nPos2);

delete pBall;

if (shengming <= 0)

{

etHeadPosition(); (bPos2 = bPos1) != NULL;)

{

CBall* pBall = (CBall*)m_ObjList[enBall].GetNext(bPos1);

CRect bRect = pBall->GetRect();

CRect tmpRect;

if (&bRect, mRect))

{

ddTail(

new CExplosion,

);

emoveAt(bPos2);

delete pBall;

if (shengming <= 0)

{

etHeadPosition(); (bPos2 = bPos1) != NULL;)

{

CBall* pBall = (CBall*)m_ObjList[endazhao].GetNext(bPos1);

CRect mRect = pBall->GetRect();

CRect tmpRect;

if (&mRect, bRect))

{

dazhao++;

emoveAt(bPos2);

delete pBall;

}

}

}

etHeadPosition(); (bPos2 = bPos1) != NULL;)

{

CBall* pBall = (CBall*)m_ObjList[enming].GetNext(bPos1);

CRect bRect = pBall->GetRect();

CRect tmpRect;

if (&bRect, mRect))

{

shengming++;

emoveAt(bPos2);

delete pBall;

}

}

}

etHeadPosition();(mPos2 = mPos1) != NULL;)

{

CBomb* pBomb = (CBomb*)m_ObjList[enBomb].GetNext(mPos1);

CRect bRect = pBomb->GetRect();

POSITION ePos1 = NULL, ePos2 = NULL;

for (ePos1 = m_ObjList[enEnemy].GetHeadPosition();(ePos2 = ePos1) != NULL;) {

CEnemy* pEnemy = (CEnemy*)m_ObjList[enEnemy].GetNext(ePos1);

CRect mRect = pEnemy->GetRect();

CRect tmpRect;

if (&bRect, mRect))

{

count++;

number += 5;

ddTail(

new CExplosion,

);

emoveAt(mPos2);

delete pBomb;

}

emoveAt(ePos2);

delete pEnemy;

break;

}

}

}

etHeadPosition(); (mPos4 = mPos3) != NULL;) {

CBomb* pBomb = (CBomb*)m_ObjList[enBomb].GetNext(mPos3);

CRect bRect = pBomb->GetRect();

POSITION ePos3 = NULL, ePos4 = NULL;

for (ePos3 = m_ObjList[enBall].GetHeadPosition(); (ePos4 = ePos3) != NULL;) {

CBall* pBall = (CBall*)m_ObjList[enBall].GetNext(ePos3);

CRect mRect = pBall->GetRect();

CRect tmpRect;

if (&bRect, mRect))

{

emoveAt(mPos4);

delete pBomb;

emoveAt(ePos4);

delete pBall;

break;

}

}

}

etHeadPosition(); (mPos6 = mPos5) != NULL;)

{

CBomb* pBomb = (CBomb*)m_ObjList[enBomb].GetNext(mPos5);

CRect bRect = pBomb->GetRect();

POSITION ePos5 = NULL, ePos6 = NULL;

for (ePos5 = m_ObjList[enboss].GetHeadPosition(); (ePos6 = ePos5) != NULL;) {

Cboss* pBall = (Cboss*)m_ObjList[enboss].GetNext(ePos5);

CRect mRect = pBall->GetRect();

CRect tmpRect;

if (&bRect, mRect))

{

boss--;

ddTail(

new CExplosion,

);

emoveAt(mPos6);

delete pBomb;

if (boss <= 0)

{

number = number + 100 * level;

bxt = 0;

emoveAt(ePos6);

delete pBall;

dazhao++;bn = 0;count = 0;shengming += 2;l=0;boss=0;

break;

}

相关主题
相关文档
最新文档