// Game.cpp: implementation of the CGame class.
//
//////////////////////////////////////////////////////////////////////
#include "Game.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CGame::CGame(CDirectWnd* win)
{
m_win = win;
m_menu = new CMenu(m_win);
m_bkground = new CBkGround(m_win);
m_about = new CAbout(m_win);
gamestate = game_menu;
}
CGame::~CGame()
{
ReleaseAll();
}
void CGame::Run()
{
switch(gamestate)
{
case game_menu: //游戏菜单
{
ShowMenu();
}
break;
case game_main: //游戏主循环
{
GameLoop(); //游戏主循环 if Game_main
}
break;
case game_quit:
{
PostMessage(m_win->GetHwnd(),WM_QUIT,0,0);
}
break;
case game_over:
{
ShowGameOver();
}
break;
case game_about:
{
ShowAbout();
}
break;
}
if(DDERR_SURFACELOST == m_win->FlipScreen())
{
m_win->LoadBitmapResource();
}
}
void CGame::ShowMenu()
{
int choseItem = m_menu->Run();
if (KEYDOWN(VK_RETURN))
{
switch(choseItem)
{
case 1:
{
InitGame();
m_win->m_music->Stop();
m_win->m_music->Play(1);
gamestate = game_main;
}
break;
case 2:
{
gamestate = game_about;
}
break;
case 3:
gamestate = game_quit;
break;
}
}
}
void CGame::GameLoop()
{
if (KEYDOWN(VK_ESCAPE))
{
m_win->m_music->Stop();
m_win->m_music->Play(0);
ReleaseObList();
gamestate = game_menu;
return;
}
// 显示背景
m_bkground->Run();
// 显示关卡
m_win->ShowText(SrcWidth/2-50,20,"第");
m_win->ShowText(SrcWidth/2-30,20,missionNum);
m_win->ShowText(SrcWidth/2-20,20,"关");
// 显示分数
m_win->ShowText(SrcWidth/2+70,20,"分数:");
m_win->ShowText(SrcWidth/2+110,20,score);
if(missionFinish)
{
if( missionNum < 5 )
{
m_win->ShowText(SrcWidth/2-100,SrcHeight/2-20,"第");
m_win->ShowText(SrcWidth/2-80,SrcHeight/2-20,missionNum);
m_win->ShowText(SrcWidth/2-70,SrcHeight/2-20,"关结束,请按空格键继续!");
if( KEYDOWN(VK_SPACE) )
{
missionNum++;
enemyNum = 0;
missionFinish = FALSE;
}
}
else if( 5 == missionNum )
{
m_win->ShowText(SrcWidth/2-100,SrcHeight/2-20,"恭喜你,你已经通关了,请按空格键退出!");
if( KEYDOWN(VK_SPACE) )
{
m_win->m_music->Stop();
m_win->m_music->Play(0);
ReleaseObList();
gamestate = game_menu;
return;
}
}
}
// 创建敌人
if(!missionFinish)
{
CreateEnemy();
}
// 遍历链表
CObNode *p = m_ObList->Head->Next;
while(p != m_ObList->Tail)
{
CObNode *q = p->Next;
while(q != m_ObList->Tail)
{
if(NULL != q)
{
if(q->BaseObj->getExist())
CheckHit(p,q);
q = q->Next;
}
}
if(NULL != p->BaseObj)
{
p->BaseObj->Run();
if ( 0 == p->BaseObj->getId() )
{
CPlayerPlane *pPlane = (CPlayerPlane *)(p->BaseObj);
// 奖励生命
if(score - oldscore >= 5000)
{
oldscore = score;
pPlane->setLifeNum(pPlane->getLifeNum() + 1);
m_win->m_snd->PlaySound(7,0);
}
// 检测我机状态
if( 0 == pPlane->getLifeNum() && 0 == pPlane->getExist() )
{
ReleaseObList();
gamestate = game_over;
return;
}
}
// 检测敌机状态
if ( 2 == p->BaseObj->getId() )
{
CEnemyPlane *ePlane = (CEnemyPlane *)(p->BaseObj);
if( 1 == ePlane->getDead() )
{
score = score + ePlane->getScore();
}
if( 3 == ePlane->getEnemyType() )
{
if ( 1 == ePlane->getDead() )
missionFinish = TRUE ;
}
}
// 检测炸弹状态
if ( 5 == p->BaseObj->getId() )
{
CBomb *bom = (CBomb *)(p->BaseObj);
if( 0 == bom->getExist() )
KillAllEnemy();
}
// 若对象存在标志为0,则删除该对象
if(p->BaseObj->getExist() == 0)
{
p = p->Last;
delete p->Next->BaseObj;
m_ObList->Delete(p->Next);
}
p = p->Next;
}
}
}
void CGame::InitGame()
{
srand( (unsigned)time( NULL ) );
enemyNum = 0;
score = 0;
oldscore = score;
missionNum = 1;
missionFinish = FALSE;
m_ObList = new CObList();
new CPlayerPlane(m_win,m_ObList,3);
char temp[5][100] = {
{
1,1,2,1,3,2,1,1,1,2, 1,2,1,1,3,1,2,1,3,2,
1,2,1,1,3,1,1,3,1,2, 1,2,1,1,3,1,2,1,3,1,
2,1,1,3,1,2,1,3,1,2, 1,2,2,1,3,1,2,1,3,1,
1,2,1,1,3,2,1,1,1,2, 1,2,2,1,3,1,2,1,3,1,
1,3,1,1,3,2,1,2,1,2, 1,2,2,1,3,1,2,1,3,4
} ,
{
2,1,3,1,3,2,1,2,1,2, 1,2,2,1,3,1,2,1,3,2,
1,3,1,3,2,2,1,3,1,2, 1,2,2,1,3,1,2,1,3,1,
2,1,3,1,3,2,1,2,1,2, 1,2,2,1,3,1,2,1,3,2,
1,3,1,3,2,2,1,3,1,2, 1,2,2,1,3,1,2,1,3,1,
2,1,3,1,3,2,1,2,1,2, 1,2,2,1,3,1,2,1,3,4
},
{
2,1,3,1,3,2,1,2,1,2, 1,2,2,1,3,1,2,1,3,2,
1,3,1,3,2,2,1,3,1,2, 1,2,2,1,3,1,2,1,3,1,
2,1,3,1,3,2,1,2,1,2, 1,2,2,1,3,1,2,1,3,2,
1,3,1,3,2,2,1,3,1,2, 1,2,2,1,3,1,2,1,3,1,
2,1,3,1,3,2,1,2,1,2, 1,2,2,1,3,1,2,1,3,4
},
{
2,1,3,1,3,2,1,2,1,2, 1,2,2,1,3,1,2,1,3,2,
1,3,1,3,2,2,1,3,1,2, 1,2,2,1,3,1,2,1,3,1,
2,1,3,1,3,2,1,2,1,2, 1,2,2,1,3,1,2,1,3,2,
1,3,1,3,2,2,1,3,1,2, 1,2,2,1,3,1,2,1,3,1,
2,1,3,1,3,2,1,2,1,2, 1,2,2,1,3,1,2,1,3,4
},
{
1,2,3,1,3,2,1,3,3,2, 1,2,2,1,3,1,2,1,3,2,
2,2,3,1,3,2,1,3,3,2, 1,2,2,1,3,1,2,1,3,1,
3,2,3,1,3,2,1,3,3,2, 1,2,2,1,3,1,2,1,3,1,
2,2,3,2,3,2,1,3,3,2, 1,2,2,1,3,1,2,1,3,1,
1,2,3,1,3,2,1,3,3,2, 1,2,2,1,3,1,2,1,3,4
}
};
for(int i=0;i<5;i++)
for(int j=0;j<100;j++)
mission[i][j]=temp[i][j];
}
void CGame::CheckHit(CObNode *Obj1,CObNode *Obj2)
{
RECT r1,r2;
m_win->GetRect(&r1,
Obj1->BaseObj->getPosX(),
Obj1->BaseObj->getPosY(),
Obj1->BaseObj->getWidth(),
Obj1->BaseObj->getHeight()
);
m_win->GetRect(&r2,
Obj2->BaseObj->getPosX(),
Obj2->BaseObj->getPosY(),
Obj2->BaseObj->getWidth(),
Obj2->BaseObj->getHeight()
);
// 0:我机 1:我机子弹 2: 敌机 3:敌机子弹 4:奖励物品
switch(Obj1->BaseObj->getId())
{
case 0:
{
if(2 == Obj2->BaseObj->getId())
{
CPlayerPlane *pPlane = (CPlayerPlane *)(Obj1->BaseObj);
CEnemyPlane *ePlane = (CEnemyPlane *)(Obj2->BaseObj);
if( !pPlane->getSuper() )
{
if( IsCollide(&r1,&r2) )
{
pPlane->setLife(pPlane->getLife() - ePlane->getLife());
}
}
}
else if(3 == Obj2->BaseObj->getId())
{
CPlayerPlane *pPlane = (CPlayerPlane *)(Obj1->BaseObj);
CEnemyBullet *eBullet = (CEnemyBullet *)(Obj2->BaseObj);
if( !pPlane->getSuper() )
{
if( IsCollide(&r1,&r2) )
{
pPlane->setLife(pPlane->getLife() - eBullet->getPower());
}
}
}
else if(4 == Obj2->BaseObj->getId())
{
if( IsCollide(&r1,&r2) )
{
Obj2->BaseObj->setExist(0);
CPlayerPlane *pPlane = (CPlayerPlane *)(Obj1->BaseObj);
CBonus *bonus = (CBonus *)(Obj2->BaseObj);
pPlane->getBonus(bonus->getBonusType());
m_win->m_snd->PlaySound(4,0);
score = score + 100;
}
}
}
break;
case 1:
{
if(2 == Obj2->BaseObj->getId())
{
if( IsCollide(&r1,&r2) )
{
Obj1->BaseObj->setExist(0);
CPlayerBullet *pBullet = (CPlayerBullet *)(Obj1->BaseObj);
CEnemyPlane *ePlane = (CEnemyPlane *)(Obj2->BaseObj);
new CExplode(m_win,
m_ObList,
ePlane->getPosX(),
ePlane->getPosY(),
2);
m_win->m_snd->PlaySound(5,0);
ePlane->setLife(ePlane->getLife() - pBullet->getPower());
}
}
}
break;
case 2:
{
if(1 == Obj2->BaseObj->getId())
{
if( IsCollide(&r1,&r2) )
{
Obj2->BaseObj->setExist(0);
CEnemyPlane *ePlane = (C
没有合适的资源?快使用搜索试试~ 我知道了~
雷霆战机( 含源代码)
共78个文件
h:22个
cpp:21个
bmp:13个
4星 · 超过85%的资源 需积分: 32 67 下载量 152 浏览量
2008-03-01
14:58:13
上传
评论 1
收藏 947KB RAR 举报
温馨提示
采用DirectX技术编写,学习的好例子。
资源推荐
资源详情
资源评论
收起资源包目录
雷霆战机.rar (78个子文件)
plane
1047343491176
Src
Main.cpp 1KB
FLY.ICO 766B
ObNode.h 615B
Menu.h 1KB
Window.cpp 2KB
Explode.h 868B
MACRO.H 391B
Explode.cpp 2KB
EnemyPlane.h 1KB
SOUND
Menu.cpp 3KB
DirectWnd.pdb 25KB
BkGround.h 721B
Fly.opt 62KB
Plane.cpp 443B
EnemyPlane.cpp 6KB
PlayerBullet.h 835B
Midi.cpp 4KB
Pic
ObList.cpp 783B
DirectWnd.cpp 10KB
Plane.h 720B
EnemyBullet.cpp 1KB
BaseObj.h 1KB
Bomb.cpp 1KB
DirectWnd.h 2KB
Sound.cpp 4KB
FLY.NCB 345KB
FLY.DSP 7KB
Bonus.h 848B
About.cpp 1KB
FLY.PLG 2KB
About.h 695B
Game.cpp 13KB
FLYRES.H 455B
Sound.h 1010B
FLYRES.APS 17KB
Bullet.h 861B
EnemyBullet.h 765B
Midi.h 1KB
BkGround.cpp 2KB
ObList.h 665B
Game.h 2KB
Bullet.cpp 506B
PlayerPlane.h 1KB
Bomb.h 668B
FLY.DSW 529B
PlayerPlane.cpp 7KB
Bonus.cpp 2KB
ObNode.cpp 562B
FLYRES.RC 2KB
Window.h 955B
PlayerBullet.cpp 1KB
BaseObj.cpp 668B
1047343491176.rar 88KB
Exe
SOUND
BONUS.WAV 21KB
Bomb.wav 93KB
eExplode.wav 29KB
BOSSEXP.WAV 54KB
GAME.MID 100KB
ADDLIFE.WAV 4KB
HIT.WAV 790B
FIRE.WAV 2KB
MENU.MID 6KB
pExplode.wav 42KB
Pic
BULLET.BMP 5KB
GAMEOVER.BMP 300KB
ENEMY1.BMP 2KB
LEFT.BMP 4KB
BOMB.BMP 4KB
BKGND.BMP 40KB
RIGHT.BMP 4KB
BONUS.BMP 28KB
ENEMY.BMP 88KB
EXPLODE.BMP 389KB
BKGND1.BMP 40KB
loading.bMP 900KB
CENTER.BMP 4KB
FLY.EXE 68KB
Welcome to vcer.net!.url 71B
共 78 条
- 1
资源评论
- luv352012-03-10感谢分享啊,代码编译没问题,但是为什么就是执行不了呢??
- qq12345q62015-04-26值得学习!
- 飘雪冰封2012-11-24用C++编写的雷霆战机,学习非常有用,很有创意,谢谢分享!
牧羊君
- 粉丝: 25
- 资源: 41
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功