// 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
没有合适的资源?快使用搜索试试~ 我知道了~
雷霆战机的c程序
共77个文件
h:22个
cpp:21个
bmp:13个
4星 · 超过85%的资源 需积分: 35 83 下载量 113 浏览量
2008-01-10
17:44:38
上传
评论
收藏 884KB RAR 举报
温馨提示
一个小游戏的c程序 感兴趣的可以看看
资源推荐
资源详情
资源评论
收起资源包目录
雷霆战机的c程序.rar (77个子文件)
雷霆战机的c程序
Src
Bomb.h 668B
EnemyPlane.h 1KB
FLYRES.H 455B
Pic
SOUND
FLY.ICO 766B
Sound.h 1010B
BaseObj.cpp 668B
Bonus.h 848B
FLY.NCB 345KB
About.cpp 1KB
DirectWnd.pdb 25KB
FLYRES.APS 17KB
FLY.PLG 2KB
Bonus.cpp 2KB
Fly.opt 62KB
Bomb.cpp 1KB
ObList.cpp 783B
Game.cpp 13KB
PlayerPlane.h 1KB
About.h 695B
Explode.cpp 2KB
Plane.h 720B
Window.cpp 2KB
PlayerPlane.cpp 7KB
Bullet.h 861B
Window.h 955B
DirectWnd.cpp 10KB
MACRO.H 391B
Explode.h 868B
PlayerBullet.cpp 1KB
FLY.DSP 7KB
Plane.cpp 443B
PlayerBullet.h 835B
Menu.h 1KB
EnemyBullet.h 765B
BkGround.cpp 2KB
Bullet.cpp 506B
Menu.cpp 3KB
ObNode.h 615B
Game.h 2KB
BaseObj.h 1KB
ObList.h 665B
Sound.cpp 4KB
EnemyBullet.cpp 1KB
FLYRES.RC 2KB
Main.cpp 1KB
Midi.h 1KB
DirectWnd.h 2KB
FLY.DSW 529B
EnemyPlane.cpp 6KB
Midi.cpp 4KB
ObNode.cpp 562B
BkGround.h 721B
Exe
Pic
ENEMY.BMP 88KB
GAMEOVER.BMP 300KB
BKGND.BMP 40KB
BKGND1.BMP 40KB
CENTER.BMP 4KB
LEFT.BMP 4KB
RIGHT.BMP 4KB
Thumbs.db 33KB
ENEMY1.BMP 2KB
loading.bMP 900KB
BONUS.BMP 28KB
BOMB.BMP 4KB
BULLET.BMP 5KB
EXPLODE.BMP 389KB
SOUND
BONUS.WAV 21KB
BOSSEXP.WAV 54KB
pExplode.wav 42KB
ADDLIFE.WAV 4KB
MENU.MID 6KB
FIRE.WAV 2KB
GAME.MID 100KB
eExplode.wav 29KB
HIT.WAV 790B
Bomb.wav 93KB
FLY.EXE 68KB
共 77 条
- 1
资源评论
- rette_jc2013-01-08算法很好,效率高
- 敲程序员的小代码2015-11-13很好,算法很牛
- qq_253125452015-01-14其他都好,怎么没有dmusici.h?
lgl99
- 粉丝: 12
- 资源: 23
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功