飞机大战实训报告
AddTail():将新的元素添加到链表最后;
GetNext( POSITION& rPosition ):使rPosition指向下一个元素。
设置定时器
SetTimer()函数来设置定时器。
背景滚动
为了让游戏场景更加逼真,游戏节奏更加合理,可以通过让背景滚动来提高游戏的场景效应,实现这一技术时,可以将一张背景图片复制为2张,从上到下连续的拼接在一起,使其不会出现图片的卡顿和瞬移现象。
4.战机子弹打中敌机,敌机就会爆炸,boss血量随关卡升高而增多,打败敌机或者boss会有分数加成。
5.设有无敌模式和普通模式,无敌模式大招无限,生命无限,战机导弹直接升至最高等级。
2.相关技术
碰撞检测
用CRect类的GetRect()函数可以获得当前对象的矩形区域,IntersectRect()并用此函数判断二者是否碰撞。
CBall* pBall = (CBall*)m_ObjList[endazhao].GetNext(bPos1);
CRect mRect = pBall->GetRect();
CRect tmpRect;
if (&mRect, bRect))
{
dazhao++;
emoveAt(bPos2);
delete pBall;
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);
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);
delete pEnemy;
break;
}
}
}
etHeadPosition(); (mPos4 = mPos3) != NULL;)
{
CBomb* pBomb = (CBomb*)m_ObjList[enBomb].GetNext(mPos3);
CRect bRect = pBomb->GetRect();
}
}
num = 100;
}
num--;
etHeadPosition(); ePos != NULL;)
{
CEnemy* pEnemy = (CEnemy*)m_ObjList[enEnemy].GetNext(ePos);
if (!pEnemy->Fired())
continue;
CPoint ePt = pEnemy->GetPoint();
}
}
}
if (GetKey(VK_F1) == 1)etHeadPosition(); ePos != NULL;)
{
Cboss* pEnemy = (Cboss*)m_ObjList[enboss].GetNext(ePos);
CPoint ePt = pEnemy->GetPoint();
CBossball * t;
CBall* pBall = (CBall*)m_ObjList[enEnemy].GetNext(nPos1);
CRect bRect = pBall->GetRect();
CRect tmpRect;
if (&bRect, mnRect))
{
ddTail(
new CExplosion,
);
emoveAt(nPos2);
if (pObj && !pObj->Draw(pMemDC, FALSE))
{
m_ObjList[i].RemoveAt(pos2);
delete pObj;
}
}
}}
ddTail(new CEnemy);
}
nCreator--;
ddTail(new Cda);
count++;
}
ddTail(new Cshengming);
CRect mRect = pEnemy->GetRect();
CRect tmpRect;
if (&bRect, mRect))
{
count++;
number += 5;
ddTail(
new CExplosion,
);
emoveAt(mPos2);
delete pBomb;
}
emoveAt(ePos2);
内存释放技术
这个程序中有大量的地方需要使用内存,如果不及时删除会出现闪图等情况,容易导致程序崩溃,要及时释放内存资源。
3.总体设计与详细设计
系统模块划分
主要功能模块
类关系图:
4.编码实现
etHeadPosition(); (pos2 = pos1) != NULL; )
{
CGameObject* pObj = (CGameObject*)m_ObjList[i].GetNext(pos1);
POSITION ePos3 = NULL, ePos4 = NULL;
for (ePos3 = m_ObjList[enBall].GetHeadPosition(); (ePos4 = ePos3) != NULL;)
{
CBall* pBall = (CBall*)m_ObjList[enBall].GetNext(ePos3);
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));
CRect mRect = pBall->GetRect();
CRect tmpRect;
if (&bRect, mRect))
{
emoveAt(mPos4);
delete pBomb;
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)
{
shengming++;
emoveAt(bPos2);
delete pBall;
}
}
}
etHeadPosition();(mPos2 = mPos1) != NULL;)
{
CBomb* pBomb = (CBomb*)m_ObjList[enBomb].GetNext(mPos1);
CRect bRect = pBomb->GetRect();
BOOL by = FALSE;
ddTail(t);
}
}
}
}
etHeadPosition(); (nPos4 = nPos3) != NULL;)
{பைடு நூலகம்
CBall* pBall = (CBall*)m_ObjList[enBossball].GetNext(nPos3);
CRect bRect = pBall->GetRect();
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));
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));