📄 game.cpp
字号:
if(!m_bSinglePlayer && m_tankright==NULL && !m_bRightBring && m_nRightPlayer>0)
{
CExplode *p=new CExplode;
if(p)
{
p->Init(23*TANKMAPCELL,38*TANKMAPCELL,5,8,m_pTankAppBuffer,32,32,1,2);
m_Explode.AddTail(p);
m_bRightBring=true;
}
}
if(!m_tankleft && !m_tankright && m_nLeftPlayer==0 && m_nRightPlayer==0 && !m_bLeftBring && !m_bRightBring)
m_nGameState=GAMEOVER;
}
}
void CGame::PlaySound(int sort)
{
switch(sort)
{
case 0:
m_wavBang.Play();
break;
case 1:
m_wavDie.Play();
break;
case 2:
m_wavShoot.Play();
case 3:
m_wavEgg.Play();
}
}
void CGame::UpdateScreen()
{
switch(m_nGameState)
{
case GAMEBEGIN:
DrawBegin();
break;
case GAMEMENU:
DrawSelectMenu();
break;
case GAMEACTIVE:
DrawWorldMap();
break;
case GAMEWIN:
DrawWin();
break;
case GAMEPAUSE:
DrawPause();
break;
case GAMEOVER:
DrawGameOver();
break;
}
}
BOOL CGame::Init(HWND hWnd)
{
if(!DDinit(hWnd))
return FALSE;
if(!GameInit())
return FALSE;
return TRUE;
}
void CGame::DestroyObject()
{
POSITION position;
position=m_Explode.GetHeadPosition();
while(position)
{
CExplode *p=m_Explode.GetNext(position);
delete p;
}
m_Explode.RemoveAll();
position=m_BulletList.GetHeadPosition();
while(position)
{
CBullet *p=m_BulletList.GetNext(position);
delete p;
}
m_BulletList.RemoveAll();
position=m_Player.GetHeadPosition();
while(position)
{
CTank *p=m_Player.GetNext(position);
delete p;
}
m_Player.RemoveAll();
m_tankleft=m_tankright=NULL;
position=m_Enemy.GetHeadPosition();
while(position)
{
CTank *p=m_Enemy.GetNext(position);
delete p;
}
m_Enemy.RemoveAll();
position=m_Egg.GetHeadPosition();
while(position)
{
CEgg *p=m_Egg.GetNext(position);
delete p;
}
m_Egg.RemoveAll();
m_midiBKMusic.Stop();
}
BOOL CGame::StartGame(int level)
{
if(level > GAMETOTALLEVEL)return FALSE;
m_nGameLevel=level;
m_nBorderTime=0;
m_nFreezeTime=0;
m_bFreeze=FALSE;
if(m_bSinglePlayer)
m_nEnemyCount=10;
else
m_nEnemyCount=20;
m_nEnemyCount+=(level-1)*3;
m_nLeftEnemy=m_nEnemyCount;
m_bLeftBring=false; //左边正在产生坦克
m_bRightBring=false;
m_nLeftKills=0;
m_nRightKills=0;
//销毁除player以外的东西
DestroyObjectForNewLevel();
//保存player的属性,但要调整坦克位置
if(m_tankleft!=NULL && m_nLeftPlayer>=0)
{
m_tankleft->SetTankPos(15,38);
m_tankleft->SetDirection(UP);
m_tankleft->SetTankLife(200);
m_tankleft->SetRect();
}
if(!m_bSinglePlayer && m_tankright!=NULL && m_nRightPlayer>=0)
{
m_tankright->SetTankPos(23,38);
m_tankright->SetDirection(UP);
m_tankright->SetTankLife(200);
m_tankright->SetRect();
}
m_nGameState=GAMEACTIVE;
m_midiBKMusic.Play(TRUE);
m_midiBKMusic.SetVolume(3);
return TRUE;
}
void CGame::BringTank(int pos)
{
if(m_nLeftEnemy <= 0)return;
CTank * pTank;
int x,y;
CRect rct;
switch(pos)
{
case 1://在左边产生一辆坦克
x=-2;y=0;
do{
x+=2;
rct.SetRect(x*TANKMAPCELL,y*TANKMAPCELL,x*TANKMAPCELL+TANKWIDTH,y*TANKMAPCELL+TANKHEIGHT);
}while(TankInRect(rct) && x<10);
if(x==10)break;
pTank=new CTank;
if(pTank)
{
pTank->Init(this,x,y,m_pEnemyBuffer,m_pTankStateBuffer,rand()%9);
pTank->SetDirection(DOWN);
m_Enemy.AddTail(pTank);
m_nLeftEnemy--;
}
break;
case 2://在中间产生一辆坦克
x=17;y=0;
do{
x+=2;
rct.SetRect(x*TANKMAPCELL,y*TANKMAPCELL,x*TANKMAPCELL+TANKWIDTH,y*TANKMAPCELL+TANKHEIGHT);
}while(TankInRect(rct) && x<28);
if(x==28)break;
pTank=new CTank;
if(pTank)
{
pTank->Init(this,x,y,m_pEnemyBuffer,m_pTankStateBuffer,rand()%9);
pTank->SetDirection(DOWN);
m_Enemy.AddTail(pTank);
m_nLeftEnemy--;
}
break;
case 3://在右边产生一辆坦克
x=40;y=0;
do{
x-=2;
rct.SetRect(x*TANKMAPCELL,y*TANKMAPCELL,x*TANKMAPCELL+TANKWIDTH,y*TANKMAPCELL+TANKHEIGHT);
}while(TankInRect(rct) && x>20);
if(x==20)break;
pTank=new CTank;
if(pTank)
{
pTank->Init(this,x,y,m_pEnemyBuffer,m_pTankStateBuffer,rand()%9);
pTank->SetDirection(DOWN);
m_Enemy.AddTail(pTank);
m_nLeftEnemy--;
}
break;
}
}
BOOL CGame::TankInRect(CRect &rc)
{
CTank *p;
CRect rect;
POSITION position=m_Player.GetHeadPosition();
while(position)
{
p=m_Player.GetNext(position);
BOOL ret=rect.IntersectRect(&rc,&(p->rect));
if(ret)
return TRUE;
}
position=m_Enemy.GetHeadPosition();
while(position)
{
p=m_Enemy.GetNext(position);
BOOL ret=rect.IntersectRect(&rc,&(p->rect));
if(ret)
return TRUE;
}
return FALSE;
}
void CGame::DestroyObjectForNewLevel()
{
POSITION position;
position=m_Explode.GetHeadPosition();
while(position)
{
CExplode *p=m_Explode.GetNext(position);
delete p;
}
m_Explode.RemoveAll();
position=m_BulletList.GetHeadPosition();
while(position)
{
CBullet *p=m_BulletList.GetNext(position);
delete p;
}
m_BulletList.RemoveAll();
position=m_Enemy.GetHeadPosition();
while(position)
{
CTank *p=m_Enemy.GetNext(position);
delete p;
}
m_Enemy.RemoveAll();
position=m_Egg.GetHeadPosition();
while(position)
{
CEgg *p=m_Egg.GetNext(position);
delete p;
}
m_Egg.RemoveAll();
m_midiBKMusic.Stop();
}
void CGame::DrawBegin()
{
static int xx=75;
static float yy=390;
static CString str[4];
str[0].LoadString(IDS_STRING001);
str[1].LoadString(IDS_STRING002);
str[2].LoadString(IDS_STRING003);
str[3].LoadString(IDS_STRING004);
RECT rc;
rc.left=0;
rc.right=SCREEN_WIDTH;
rc.top=0;
rc.bottom=SCREEN_HEIGHT;
DDClear(&rc,RGB(0,0,0));
rc.right=300;
rc.bottom=194;
m_pddsBackBuffer->BltFast(150,200, m_pBeginBuffer, &rc, DDBLTFAST_WAIT );
CFont font;
font.CreateFont(20,10, 0, 0, FW_BOLD , 0, 0, 0, ANSI_CHARSET,
OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY, FF_ROMAN, "楷体");
for(int i=0;i<4;i++)
{
yy-=0.07;
if(int(yy)<100)
{
yy=390;
m_nGameState=GAMENEXT;
if(m_pBeginBuffer)
{
m_pBeginBuffer->Release();
m_pBeginBuffer=NULL;
}
}
OutputText(xx,int(yy)+i*25,str[i],RGB(255,0,0),&font);
}
font.DeleteObject();
rc.left=0;
rc.right=SCREEN_WIDTH;
rc.top=0;
rc.bottom=200;
DDClear(&rc,RGB(0,0,0));
rc.left=0;
rc.right=SCREEN_WIDTH;
rc.top=394;
rc.bottom=SCREEN_HEIGHT;
DDClear(&rc,RGB(0,0,0));
LPDIRECTDRAWSURFACE tempbuffer=NULL;
tempbuffer=DDLoadBitmap("pic\\bmp\\select.bmp");
rc.left=0;
rc.right=rc.left+106;
rc.top=0;
rc.bottom=rc.top+48;
if(tempbuffer)
m_pddsBackBuffer->BltFast(120,500, tempbuffer, &rc, DDBLTFAST_WAIT );
rc.left=0;
rc.right=rc.left+106;
rc.top=48;
rc.bottom=rc.top+48;
if(tempbuffer)
m_pddsBackBuffer->BltFast(400,500, tempbuffer, &rc, DDBLTFAST_WAIT );
if(tempbuffer)
{
tempbuffer->Release();
tempbuffer=NULL;
}
rc.left=96;
rc.top=0;
rc.right=128;
rc.bottom=32;
if(m_bSinglePlayer)
m_pddsBackBuffer->BltFast( 80, 510, m_pPlayerBuffer, &rc, DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT );
else
m_pddsBackBuffer->BltFast( 360, 510, m_pPlayerBuffer, &rc, DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT );
FlipScreen();
}
void CGame::DrawLevel(int level)
{
if(level>GAMETOTALLEVEL)return;
RECT rc;
rc.left=0;
rc.right=SCREEN_WIDTH;
rc.top=0;
rc.bottom=SCREEN_HEIGHT;
DDClear(&rc,RGB(0,0,0));
m_pLevelBuffer=DDLoadBitmap("pic\\bmp\\level.bmp");
if(!m_pLevelBuffer){AfxMessageBox("载入游戏关图失败");return;}
DDSetColorKey(m_pLevelBuffer, RGB(0,0,255) );
if(m_pLevelBuffer)
{
rc.left=0;
rc.top=(level-1)*100;
rc.right=rc.left+640;
rc.bottom=rc.top+100;
m_pddsBackBuffer->BltFast(0,250, m_pLevelBuffer, &rc, DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY );
FlipScreen();
m_pLevelBuffer->Release();
m_pLevelBuffer=NULL;
}
}
void CGame::DrawWin()
{
CFont font;
font.CreateFont(30,12, 0, 0, FW_BOLD , 0, 0, 0, ANSI_CHARSET,
OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY, FF_ROMAN, "楷体");
CString strTemp("你已经经过敌人的重重炮火,到达了胜利的彼岸!");
OutputText(80,200,strTemp,RGB(255,0,255),&font);
font.DeleteObject();
font.CreateFont(50,30, 0, 0, FW_BOLD , 0, 0, 0, ANSI_CHARSET,
OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY, FF_ROMAN, "楷体");
strTemp="祝:";
OutputText(300,250,strTemp,RGB(255,0,255),&font);
font.DeleteObject();
font.CreateFont(40,30, 0, 0, FW_BOLD , 0, 0, 0, ANSI_CHARSET,
OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY, FF_ROMAN, "楷体");
strTemp="新年快乐, 万事如意!";
OutputText(80,350,strTemp,RGB(255,0,255),&font);
font.DeleteObject();
FlipScreen();
}
void CGame::DrawPause()
{
CFont font;
font.CreateFont(20,10, 0, 0, FW_BOLD , 0, 0, 0, ANSI_CHARSET,
OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY, FF_ROMAN, "楷体");
CString strTemp("暂 停");
OutputText(590,10,strTemp,RGB(255,255,0),&font);
FlipScreen();
font.DeleteObject();
}
BOOL CGame::DrawSelectMenu()
{
CRect rc;
rc.left=0;
rc.right=rc.left+351;
rc.top=0;
rc.bottom=rc.top+240;
if(m_pMenuBuffer)
m_pddsBackBuffer->BltFast(150,200, m_pMenuBuffer, &rc, DDBLTFAST_WAIT |DDBLTFAST_SRCCOLORKEY);
rc.left=96;
rc.top=0;
rc.right=128;
rc.bottom=32;
m_pddsBackBuffer->BltFast( 155, 212+(m_nMenuPos-1)*60, m_pPlayerBuffer, &rc, DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT );
FlipScreen();
return FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -