📄 game.cpp
字号:
}
break;
case 0:
if ( abs(dPlane.DevRect[0].left-dEmyPlane.DevRect[p].left+7)<20 &&
abs(dPlane.DevRect[0].top-dEmyPlane.DevRect[p].top+12)<17 )
{
PlaySound(MAKEINTRESOURCE(IDR_WAVE_BOMB),AfxGetApp()->m_hInstance,SND_RESOURCE|SND_ASYNC);
dEmyPlane.bDeadFlag[p]=1;
BusPos[0].x=dEmyPlane.DevRect[p].left-15;
BusPos[0].y=dEmyPlane.DevRect[p].top-15;
BlastType = 1;
dPlane.bDeadFlag[0] = 1;
//我机飞机数量--,被撞毁
nPlaneLife--;
//损失总数++
// m_iTotalPlane++;
}
break;
case 2: //敌机
if ( abs(dPlane.DevRect[0].left-dEmyPlane.DevRect[p].left+7)<20 &&
abs(dPlane.DevRect[0].top-dEmyPlane.DevRect[p].top+12)<17 )
{
PlaySound(MAKEINTRESOURCE(IDR_WAVE_BOMB),AfxGetApp()->m_hInstance,SND_RESOURCE|SND_ASYNC);
dEmyPlane.bDeadFlag[p]=1;
BusPos[0].x=dEmyPlane.DevRect[p].left-15;
BusPos[0].y=dEmyPlane.DevRect[p].top-15;
BlastType = 1;
dPlane.bDeadFlag[0] = 1;
//我机飞机数量--,被撞毁
nPlaneLife--;
//损失总数++
// m_iTotalPlane++;
}
break;
}
}
if (nPlaneLife <= 0) //游戏结束
{
DrawGameOver();
m_bResetGame = TRUE;
}
}
//画爆炸火焰效果
void CGame::DrawBlast()
{
//敌机爆炸火焰
for (int f=0; f<m_iEmyNums; f++)
{
if (0 != EmyBlastType[f])
{
RECT rc,rc1;
GetRect(&rc, dEmyBlast.DevRect[f].left, dEmyBlast.DevRect[f].top, 66, 66);
GetRect(&rc1, (EmyBlastType[f] - 1)*66, 0, 66, 66);
BitBlt(g_hBufDC,rc.left,rc.top,rc1.right-rc1.left,rc1.bottom-rc1.top,
dEmyBlast.hDevDC,rc1.left,rc1.top,SRCINVERT);
static int otime[EMYNUMS];
if (GetTickCount()-otime[f]>150)
{
otime[f]=GetTickCount();
EmyBlastType[f]++;//更新火焰状态
if (EmyBlastType[f]==9 ) EmyBlastType[f]=0;//火焰完毕
}
}
}
//Boss爆炸火焰
if (0 != EmyBossBlastType)
{
RECT rc,rc1;
GetRect(&rc, EmyBossBusPos.x, EmyBossBusPos.y, 66, 66);
GetRect(&rc1, (EmyBossBlastType - 1)*66, 0, 66, 66);
BitBlt(g_hBufDC,rc.left,rc.top,rc1.right-rc1.left,rc1.bottom-rc1.top,
g_EmyBossBlast,rc1.left,rc1.top,SRCINVERT);
BitBlt(g_hBufDC,rc.left+80,rc.top,rc1.right-rc1.left,rc1.bottom-rc1.top,
g_EmyBossBlast,rc1.left,rc1.top,SRCINVERT);
BitBlt(g_hBufDC,rc.left+80,rc.top+80,rc1.right-rc1.left,rc1.bottom-rc1.top,
g_EmyBossBlast,rc1.left,rc1.top,SRCINVERT);
BitBlt(g_hBufDC,rc.left,rc.top+80,rc1.right-rc1.left,rc1.bottom-rc1.top,
g_EmyBossBlast,rc1.left,rc1.top,SRCINVERT);
static int obosstime = 0;
if (GetTickCount()-obosstime>150)
{
obosstime=GetTickCount();
EmyBossBlastType++;//更新火焰状态
if (EmyBossBlastType==9 )
{
EmyBossBlastType=0;//火焰完毕
}
}
}
//我机爆炸火焰
if (0 != BlastType)
{
RECT rect, srect;
GetRect(&rect, BusPos[0].x, BusPos[0].y, 66, 66);
GetRect(&srect,(BlastType-1)*66, 0, 66, 66);
BitBlt(g_hBufDC,rect.left,rect.top,srect.right-srect.left,srect.bottom-srect.top,
g_hBusDC,srect.left,srect.top,SRCINVERT);
static int oldtime=0;//延时
if (GetTickCount()-oldtime>200)
{
oldtime=GetTickCount();
BlastType++;//更新火焰状态
if (BlastType==9 ) BlastType=0;//火焰完毕
}
}
}
//将缓冲内容贴到屏幕
void CGame::DrawFlip()
{
RECT Window;
POINT pt;
GetClientRect(pGWnd->m_hWnd, &Window);
pt.x=pt.y=0;
ClientToScreen(pGWnd->m_hWnd, &pt);
OffsetRect(&Window, pt.x, pt.y);
HDC hDC = GetDC(pGWnd->m_hWnd);
BitBlt(hDC,0,0,ScreenW,ScreenH,g_hBufDC,0,0,SRCCOPY);
ReleaseDC(pGWnd->m_hWnd,hDC);
hDC = NULL;
return ;
}
UINT CGame::PlayThread(LPVOID lpVoid)
{
CGame* pGame = (CGame*)lpVoid;
int iResult = 1;
while(1)
{
//用于终止线程
iResult = WaitForSingleObject(pGame->m_ExistEvent.m_hObject, 10);
if(iResult == WAIT_OBJECT_0)
{
break;
}
pGame->UpdateFrame();
}
return 1;
}
void CGame::ControlPlanePos(int Direction)
{
RECT rect;
pGWnd->GetWindowRect(&rect);
int Width = rect.right - rect.left;
int Heighth = rect.bottom - rect.top;
if ( Direction == VK_UP )
{
if ( (dPlane.DevRect[0].top - dPlane.MoveSpeed[0]) > 0 )
{
dPlane.DevRect[0].top = dPlane.DevRect[0].top - dPlane.MoveSpeed[0];
// dPlane.DevRect[0].bottom = dPlane.DevRect[0].bottom - dPlane.MoveSpeed[0];
}
}
if ( Direction == VK_DOWN )
{
if ( (dPlane.DevRect[0].top + 60 + dPlane.MoveSpeed[0]) < Heighth )
{
dPlane.DevRect[0].top = dPlane.DevRect[0].top + dPlane.MoveSpeed[0];
// dPlane.DevRect[0].bottom = dPlane.DevRect[0].bottom + dPlane.MoveSpeed[0];
}
}
if ( Direction == VK_LEFT )
{
if ( (dPlane.DevRect[0].left - dPlane.MoveSpeed[0]) > 0 )
{
dPlane.DevRect[0].left = dPlane.DevRect[0].left - dPlane.MoveSpeed[0];
// dPlane.DevRect[0].right = dPlane.DevRect[0].right - dPlane.MoveSpeed[0];
}
}
if ( Direction == VK_RIGHT )
{
if ( (dPlane.DevRect[0].left + 50 + dPlane.MoveSpeed[0]) < Width )
{
dPlane.DevRect[0].left = dPlane.DevRect[0].left + dPlane.MoveSpeed[0];
// dPlane.DevRect[0].right = dPlane.DevRect[0].right + dPlane.MoveSpeed[0];
}
}
dPlane.CenterPos = CPoint((dPlane.DevRect[0].right+dPlane.DevRect[0].left)/2,
(dPlane.DevRect[0].bottom+dPlane.DevRect[0].top)/2);
}
//是否在区域内
BOOL CGame::IsOutRect(POINT p)
{
if (p.x<35 || p.x>ScreenW+35 || p.y<35 || p.y>ScreenH+35)
return TRUE;
else
return FALSE;
}
void CGame::DrawScore()
{
dTotalScore = TotalKillNums * 100;
CString strText;
strText.Format("分数: %u",dTotalScore);
SetBkMode(g_hBufDC,TRANSPARENT);
SetTextColor(g_hBufDC, RGB(255,255,255));
TextOut(g_hBufDC,0,0,strText,strText.GetLength());
RECT rc,rc1;
GetRect(&rc, 0, 485, 8, 8);
GetRect(&rc1, (nPlaneLife-1)*8, 485, 8, 8);
BitBlt(g_hBufDC,rc.left,rc.top,rc1.right-rc.left,rc1.bottom-rc1.top,
g_hLifeDC,0,0,SRCINVERT);
}
void CGame::RestAll()
{
//我方装备初始化
GetRect(&(dPlane.DevRect[0]), ScreenW/2 - 25, ScreenH - 50, 50, 60);
dPlane.CenterPos = CPoint((dPlane.DevRect[0].right+dPlane.DevRect[0].left)/2,
(dPlane.DevRect[0].bottom+dPlane.DevRect[0].top)/2);
dPlane.MoveSpeed[0] = 3;
BlastType = 0;
dPlane.bDeadFlag[0] = 0;
nPlaneLife = 4;
m_bNewReset = FALSE;
m_bCanControl = FALSE;
m_bResetGame = FALSE;
KillEmyNums = 0;
TotalKillNums = 0;
dTotalScore = 0;
m_iBomb = 4;
for ( int i = 0; i < DEVNUMS; i++)
{
dBulletL.DevRect[i].left = 0;
dBulletL.DevRect[i].top = 0;
dBulletL.DevRect[i].bottom =0;
dBulletL.DevRect[i].right = 0;
dBulletR.DevRect[i].left = 0;
dBulletR.DevRect[i].top = 0;
dBulletR.DevRect[i].bottom =0;
dBulletR.DevRect[i].right = 0;
}
//敌方装备初始化
for (i = 0; i < EMYNUMS; i++)
{
dEmyPlane.DevRect[i].left = 0;
dEmyPlane.DevRect[i].top = 0;
dEmyPlane.DevRect[i].bottom =0;
dEmyPlane.DevRect[i].right = 0;
dEmyPlane.bDeadFlag[i] = 0;
dEmyPlane.MoveSpeed[i] = 2;
dEmyPlane.MoveWay[i] = 0;
EmyType[i] = 0;
dEmyBlast.DevRect[i].left = 0;
dEmyBlast.DevRect[i].top = 0;
dEmyBlast.DevRect[i].bottom =0;
dEmyBlast.DevRect[i].right = 0;
dEmyBlast.bDeadFlag[i] = 0;
dEmyBlast.MoveSpeed[i] = 2;
dEmyBlast.MoveWay[i] = 0;
EmyBlastType[i] = 0;
dEmyBoss.DevRect[i].left = 0;
dEmyBoss.DevRect[i].top = 0;
dEmyBoss.DevRect[i].bottom =0;
dEmyBoss.DevRect[i].right = 0;
dEmyBoss.bDeadFlag[i] = 0;
dEmyBoss.MoveSpeed[i] = 2;
dEmyBoss.MoveWay[i] = 0;
// EmyBlastType[i] = 0;
dEmyBossBal.DevRect[i].left = 0;
dEmyBossBal.DevRect[i].top = 0;
dEmyBossBal.DevRect[i].bottom =0;
dEmyBossBal.DevRect[i].right = 0;
dEmyBossBal.bDeadFlag[i] = 0;
dEmyBossBal.MoveSpeed[i] = 2;
dEmyBossBal.MoveWay[i] = 0;
}
m_iBallNum = 0;
m_iFoeBossBlood = 100;
m_BossBloodCheck = m_iFoeBossBlood;
EmyBossBlastType = 0;
switch(m_iLevel)
{
case 1:
m_iBossTotalBalNum = 6;
m_iEmyNums = 6;
MoveSpeed = 2;
break;
case 2:
m_iBossTotalBalNum = 8;
m_iEmyNums = 7;
MoveSpeed = 3;
break;
case 3:
m_iBossTotalBalNum = 10;
m_iEmyNums = 9;
MoveSpeed = 4;
break;
case 4:
m_iBossTotalBalNum = 12;
m_iEmyNums = 11;
MoveSpeed = 5;
break;
}
m_bBossBalClr = FALSE;
m_iBossBalClr = 0;
m_bSeeBoss = FALSE;
m_EnterNextLevelTime = 0;
VOpen();
}
void CGame::DrawGameOver()
{
RECT rect;
GetRect(&rect, 150, 200, 50, 60);
BitBlt(g_hBufDC,rect.left,rect.top,ScreenW,ScreenH,g_hGameOverDC ,0,0,SRCINVERT);
}
//过关
void CGame::PassLevel()
{
if ( m_iFoeBossBlood > 0 || m_iLevel == 1 || EmyBossBlastType > 0)
{
return;
}
HDC hDC = GetDC(pGWnd->m_hWnd);
if(m_iLevel > 4)
{
//游戏结束,打了通关=3
// m_iGameStatus = 3;
m_bResetGame = TRUE;
return;
}
HBITMAP hBitMap = NULL;
EmyBossBlastType = 0;
CString strTempFile = "";
//BOSS和BOSS子弹贴图部分未完成
switch(m_iLevel)
{
case 0:
break;
case 1:
strTempFile = GetModuleDir() + "\\resource\\map1.bmp";
hBitMap = SHLoadDIBitmap(strTempFile);
SelectObject(g_hMapDC,hBitMap);
strTempFile = GetModuleDir() + "\\resource\\boss1.bmp";
hBitMap = SHLoadDIBitmap(strTempFile);
SelectObject(dEmyBoss.hDevDC,hBitMap);
m_iBossTotalBalNum = 6;
m_iEmyNums = 6;
MoveSpeed = 2;
m_iFoeBossBlood = 100;
m_BossBloodCheck = m_iFoeBossBlood;
break;
case 2:
strTempFile = GetModuleDir() + "\\resource\\map2.bmp";
hBitMap = SHLoadDIBitmap(strTempFile);
SelectObject(g_hMapDC,hBitMap);
strTempFile = GetModuleDir() + "\\resource\\boss2.bmp";
hBitMap = SHLoadDIBitmap(strTempFile);
SelectObject(dEmyBoss.hDevDC,hBitMap);
m_iBossTotalBalNum = 8;
m_iEmyNums = 7;
MoveSpeed = 3;
m_iFoeBossBlood = 100;
m_BossBloodCheck = m_iFoeBossBlood;
break;
case 3:
strTempFile = GetModuleDir() + "\\resource\\map3.bmp";
hBitMap = SHLoadDIBitmap(strTempFile);
SelectObject(g_hMapDC,hBitMap);
strTempFile = GetModuleDir() + "\\resource\\boss2.bmp";
hBitMap = SHLoadDIBitmap(strTempFile);
SelectObject(dEmyBoss.hDevDC,hBitMap);
m_iBossTotalBalNum = 10;
m_iEmyNums = 9;
MoveSpeed = 4;
m_iFoeBossBlood = 100;
m_BossBloodCheck = m_iFoeBossBlood;
break;
case 4:
strTempFile = GetModuleDir() + "\\resource\\map4.bmp";
hBitMap = SHLoadDIBitmap(strTempFile);
SelectObject(g_hMapDC,hBitMap);
strTempFile = GetModuleDir() + "\\resource\\boss2.bmp";
hBitMap = SHLoadDIBitmap(strTempFile);
SelectObject(dEmyBoss.hDevDC,hBitMap);
m_iBossTotalBalNum = 12;
m_iEmyNums = 11;
MoveSpeed = 5;
m_iFoeBossBlood = 100;
m_BossBloodCheck = m_iFoeBossBlood;
break;
}
strTempFile = GetModuleDir() + "\\resource\\bossbal1.bmp";
hBitMap = SHLoadDIBitmap(strTempFile);
SelectObject(dEmyBossBal.hDevDC,hBitMap);
ReleaseDC(pGWnd->m_hWnd,hDC);
hDC = NULL;
m_iBomb = 4;
VClose();
}
//垂直方向关闭屏幕效果
void CGame::VClose()
{
CString strTempFile = "";
strTempFile = GetModuleDir() + "\\resource\\pass.wav";
PlaySound (strTempFile,NULL,SND_FILENAME|SND_ASYNC);
HDC hDC = GetDC(pGWnd->m_hWnd);
RECT rc;
GetClientRect(pGWnd->m_hWnd,&rc);
int a,b;
a = 30;
b = 20;
for (int m=0;m<a;m++)
{
BitBlt(hDC,0,0,ScreenW,rc.top,g_hBufDC,0,0,BLACKNESS);
BitBlt(hDC,0,rc.bottom,ScreenW,(ScreenH-rc.bottom),g_hBufDC,0,0,BLACKNESS);
rc.top += b;
rc.bottom -= b;
::Sleep(5);
}
//用于绘制“请稍候……”
rc.left=0;
rc.top=ScreenH/2 - 20;
rc.right=ScreenW;
rc.bottom=ScreenH;
SetTextColor(hDC,0x0000ffff);//黄色
SetBkMode(hDC,TRANSPARENT);//设置透明背景
if(m_iLevel > 1)
{
CString str = "";
str.Format("祝贺通过第%d关!",m_iLevel-1);
DrawText(hDC,str,-1,&rc,DT_CENTER);
rc.top += 20;
rc.bottom += 20;
}
DrawText(hDC,TEXT("请稍侯……"),-1,&rc,DT_CENTER);
ReleaseDC(pGWnd->m_hWnd,hDC);
hDC = NULL;
Sleep(3000);
}
//我机放雷
void CGame::FlashScreen()
{
//一架飞机只有3次放雷的机会
if(m_iBomb <= 0) return;
CString strTempFile = "";
strTempFile = GetModuleDir() + "\\resource\\thunder.wav";
PlaySound (strTempFile,NULL,SND_FILENAME|SND_ASYNC);
HDC hDC = GetDC(pGWnd->m_hWnd);
int iBombW = 84; //雷的图片宽度
for(int i=0;i<(ScreenW/iBombW)+1;i++)
{
BitBlt(hDC,i*84,20,ScreenW,ScreenH,g_hBomDC,0,0,SRCINVERT);
}
ReleaseDC(pGWnd->m_hWnd,hDC);
hDC = NULL;
//敌机消失,只是消失呢,不给计算敌机损失,
//保护一下自己而已。想打通关,就用作弊方式吧
for (i=0; i<m_iEmyNums; i++)
{
dEmyPlane.bDeadFlag[i] = 1;
dEmyBlast.DevRect[i].left = dEmyPlane.DevRect[i].left - 10; //火焰坐标
dEmyBlast.DevRect[i].top = dEmyPlane.DevRect[i].top - 8; //火焰坐标
EmyBlastType[i] = 1; //火焰状态
//敌机损失数量++
KillEmyNums++;
TotalKillNums++;
}
//如果有BOSS
if(TRUE == m_bSeeBoss)
{
//如果BOSS与我机相距少于等于一个飞机宽AND
//少于等于一个飞机高度,BOSS血减掉5
//否则雷白放了哦:-)减少一点难度吧,呵呵
m_iFoeBossBlood -= 5;
for(i=0;i<m_iBossTotalBalNum;i++)
{
dEmyBossBal.DevRect[i].left = ScreenW;
dEmyBossBal.DevRect[i].top = ScreenH;
}
}
//雷数量--
//超级用户当然不减了哈哈
// if(FALSE == m_iniSuperUser)
m_iBomb --;
Sleep(500);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -