📄 game.cpp
字号:
for(i=0;i<m_iBossTotalBalNum;i++)
{
dEmyBossBal.DevRect[i].left = dEmyBoss.DevRect[0].left + 50;
dEmyBossBal.DevRect[i].top = dEmyBoss.DevRect[0].top + 120;
}
PlaySound(MAKEINTRESOURCE(IDR_WAVE_BOSSBALL),AfxGetApp()->m_hInstance,SND_RESOURCE|SND_ASYNC); //子弹声效
}
else
{
for(i=0;i<m_iBossTotalBalNum;i++)
{
if (m_iBossBalClr >= m_iBossTotalBalNum)
{
m_bBossBalClr = TRUE;
m_iBossBalClr = 0;
}
dEmyBossBal.MoveWay[i] = rand()%20-10; //-40~40
dEmyBossBal.MoveSpeed[i] = rand()%3 + MoveSpeed; //0~20
GetRect(&rect, dEmyBossBal.DevRect[i].left, dEmyBossBal.DevRect[i].top, 25, 25);
BitBlt(g_hBufDC,rect.left,rect.top,ScreenW,ScreenH,dEmyBossBal.hDevDC,0,0,SRCINVERT);
if(dEmyBoss.DevRect[0].left < ScreenW/2)
{
dEmyBossBal.DevRect[i].left += dEmyBossBal.MoveWay[i];
dEmyBossBal.DevRect[i].top += dEmyBossBal.MoveSpeed[i];
}
else if(dEmyBoss.DevRect[0].left > ScreenW/2)
{
dEmyBossBal.DevRect[i].left -= dEmyBossBal.MoveWay[i];
dEmyBossBal.DevRect[i].top += dEmyBossBal.MoveSpeed[i];
}
if( dEmyBossBal.DevRect[i].left>ScreenW+100 ||
dEmyBossBal.DevRect[i].left<-100 ||
dEmyBossBal.DevRect[i].top>ScreenH+120 ||
dEmyBossBal.DevRect[i].top<-120 )
{
m_iBossBalClr++;
}
}
}
break;
}
//m_iFoeBossBalType = (int)(2*((long)rand()/32767.0));//0,1
//m_iFoeBossBalWay[i] = (int)(3*((long)rand()/32767.0))-1;//-1,0,1
}
//画敌机BOSS
void CGame::DrawEmyBoss()
{
if( KillEmyNums <= (PASSBOSS * m_iLevel) )
{
dEmyBoss.DevRect[0].left = 0;
dEmyBoss.DevRect[0].top = 0;
return;
}
m_bSeeBoss = TRUE;
if ( m_iFoeBossBlood <= 0 )
{
m_bSeeBoss = FALSE;
KillEmyNums = 0;
m_iLevel ++;
m_EnterNextLevelTime = 0;
// EmyBossBlastType = 1;
// EmyBossBusPos.x=dEmyBoss.DevRect[0].left;
// EmyBossBusPos.y=dEmyBoss.DevRect[0].top;
// PassLevel();
return;
}
RECT rect;
switch(m_iLevel)
{
case 1: //第一关
GetRect(&rect,dEmyBoss.DevRect[0].left,dEmyBoss.DevRect[0].top,100,120);
BitBlt(g_hBufDC,rect.left,rect.top+26,ScreenW,ScreenH,dEmyBoss.hDevDC,0,0,SRCINVERT);
if(dEmyBoss.DevRect[0].left - dEmyBoss.MoveSpeed[0] <= 0)
{
dEmyBoss.MoveWay[0] = 1;
}
else if(dEmyBoss.DevRect[0].left + dEmyBoss.MoveSpeed[0] >= ScreenW - 50)
{
dEmyBoss.MoveWay[0] = -1;
}
dEmyBoss.DevRect[0].left += dEmyBoss.MoveSpeed[0] * dEmyBoss.MoveWay[0];
dEmyBlast.DevRect[0].left = dEmyBoss.DevRect[0].left + (int)(10*((long)rand()/32767.0)); //火焰坐标
dEmyBlast.DevRect[0].top = dEmyBoss.DevRect[0].top + 60; //火焰坐标
break;
case 2:
GetRect(&rect,dEmyBoss.DevRect[0].left,dEmyBoss.DevRect[0].top,109,73);
BitBlt(g_hBufDC,rect.left,rect.top+26,ScreenW,ScreenH,dEmyBoss.hDevDC,0,0,SRCINVERT);
if(dEmyBoss.DevRect[0].left - dEmyBoss.MoveSpeed[0] <= 0)
{
dEmyBoss.MoveWay[0] = 1;
}
else if(dEmyBoss.DevRect[0].left + dEmyBoss.MoveSpeed[0] >= ScreenW - 50)
{
dEmyBoss.MoveWay[0] = -1;
}
dEmyBoss.DevRect[0].left += dEmyBoss.MoveSpeed[0] * dEmyBoss.MoveWay[0];
dEmyBlast.DevRect[0].left = dEmyBoss.DevRect[0].left + (int)(10*((long)rand()/32767.0)); //火焰坐标
dEmyBlast.DevRect[0].top = dEmyBoss.DevRect[0].top + 60; //火焰坐标
break;
case 3:
GetRect(&rect,dEmyBoss.DevRect[0].left,dEmyBoss.DevRect[0].top,109,73);
BitBlt(g_hBufDC,rect.left,rect.top+26,ScreenW,ScreenH,dEmyBoss.hDevDC,0,0,SRCINVERT);
if(dEmyBoss.DevRect[0].left - dEmyBoss.MoveSpeed[0] <= 0)
{
dEmyBoss.MoveWay[0] = 1;
}
else if(dEmyBoss.DevRect[0].left + dEmyBoss.MoveSpeed[0] >= ScreenW - 50)
{
dEmyBoss.MoveWay[0] = -1;
}
dEmyBoss.DevRect[0].left += dEmyBoss.MoveSpeed[0] * dEmyBoss.MoveWay[0];
dEmyBlast.DevRect[0].left = dEmyBoss.DevRect[0].left + (int)(10*((long)rand()/32767.0)); //火焰坐标
dEmyBlast.DevRect[0].top = dEmyBoss.DevRect[0].top + 60; //火焰坐标
break;
case 4:
GetRect(&rect,dEmyBoss.DevRect[0].left,dEmyBoss.DevRect[0].top,109,73);
BitBlt(g_hBufDC,rect.left,rect.top+26,ScreenW,ScreenH,dEmyBoss.hDevDC,0,0,SRCINVERT);
if(dEmyBoss.DevRect[0].left - dEmyBoss.MoveSpeed[0] <= 0)
{
dEmyBoss.MoveWay[0] = 1;
}
else if(dEmyBoss.DevRect[0].left + dEmyBoss.MoveSpeed[0] >= ScreenW - 50)
{
dEmyBoss.MoveWay[0] = -1;
}
dEmyBoss.DevRect[0].left += dEmyBoss.MoveSpeed[0] * dEmyBoss.MoveWay[0];
dEmyBlast.DevRect[0].left = dEmyBoss.DevRect[0].left + (int)(10*((long)rand()/32767.0)); //火焰坐标
dEmyBlast.DevRect[0].top = dEmyBoss.DevRect[0].top + 60; //火焰坐标
break;
case 5:
/* GetRect(&rect,m_pFoeBossPos.x,m_pFoeBossPos.y,109,73);
BitBlt(g_hBufDC,rect.left,rect.top+26,ScreenW,ScreenH,g_hFoeBossDC,0,0,SRCINVERT);
if(m_pFoeBossPos.x <= 0)
m_bMoveBossRight = TRUE;
else if(m_pFoeBossPos.x >= ScreenW)
m_bMoveBossRight = FALSE;
if(TRUE == m_bMoveBossRight)
m_pFoeBossPos.x += m_iFoeBossSpeed + (movespeed);
else
m_pFoeBossPos.x -= m_iFoeBossSpeed + (movespeed);*/
break;
} //end switch(m_iLevel) here
if ( m_BossBloodCheck > m_iFoeBossBlood && EmyBlastType[0] == 0)
{
m_BossBloodCheck = m_iFoeBossBlood;
EmyBlastType[0] = 1; //火焰状态
/* RECT rc,rc1;
GetRect(&rc, dEmyBoss.DevRect[0].left+50+ 30*dEmyBoss.MoveWay[0], dEmyBoss.DevRect[0].top+60, 66, 66);
GetRect(&rc1, 0, 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); */
}
DrawEmyBossBal();
dEmyBoss.MoveSpeed[0] = (int)(4*((long)rand()/32767.0))+1;
// m_iFoeBossType=(int)(2*((long)rand()/32767.0));//0,1
}
//检测我机是否被敌机BOSS击中
void CGame::CheckBoss()
{
//BOSS没有出现
if(FALSE == m_bSeeBoss) return;
if (nPlaneLife <= 0 || dPlane.bDeadFlag[0] == 1)
{
return;
}
int b;
//BOSS是否被我机击中
for(b=0;b<DEVNUMS;b++)
{
if ( abs(dEmyBoss.DevRect[0].left-dBulletL.DevRect[b].left)<10 &&
abs(dEmyBoss.DevRect[0].top-dBulletL.DevRect[b].top)<20 )
{
m_iFoeBossBlood--;
m_iFoeBossBlood--;
dBulletL.DevRect[b].top = -50; //使子弹消失
}
if ( abs(dEmyBoss.DevRect[0].left-dBulletR.DevRect[b].left)<10 &&
abs(dEmyBoss.DevRect[0].top-dBulletR.DevRect[b].top)<20 )
{
m_iFoeBossBlood--;
m_iFoeBossBlood--;
dBulletR.DevRect[b].top = -50; //使子弹消失
}
}
if ( m_iFoeBossBlood <= 0 )
{
EmyBossBlastType = 1;
EmyBossBusPos.x=dEmyBoss.DevRect[0].left;
EmyBossBusPos.y=dEmyBoss.DevRect[0].top;
}
//超级用户,打不死哈哈
// if(TRUE == m_iniSuperUser) return;
//我机重新初始化的时候
if(TRUE == m_bNewReset) return;
//我机是否被BOSS击中
switch(m_iLevel)
{
case 5: //第一关
case 2:
case 3:
case 4:
case 1:
for (b=0; b<m_iBossTotalBalNum; b++)
{
if ( abs(dPlane.DevRect[0].left-dEmyBossBal.DevRect[b].left+12)<25 &&
abs(dPlane.DevRect[0].top-dEmyBossBal.DevRect[b].top+12)<30)
{
BusPos[0].x=dEmyBossBal.DevRect[b].left-29;
BusPos[0].y=dEmyBossBal.DevRect[b].top-29;
BlastType = 1;
dPlane.bDeadFlag[0] = 1;
//我机飞机数量--,被击中
nPlaneLife --;
//损失总数++
// m_iTotalPlane++;
}
}
//我机被BOSS撞毁,重叠半个飞机距离
if ( abs(dEmyBoss.DevRect[0].left+50-dPlane.DevRect[0].left)<25 &&
abs(dEmyBoss.DevRect[0].top+60-dPlane.DevRect[0].top)<30 )
{
BusPos[0].x=dPlane.DevRect[0].left-29;
BusPos[0].y=dPlane.DevRect[0].top-29;
BlastType = 1;
dPlane.bDeadFlag[0] = 1;
//我机飞机数量--,被撞毁
nPlaneLife --;
//损失总数++
// m_iTotalPlane++;
}
break;
}
}
//画敌机
void CGame::DrawEmyPlane()
{
if (nPlaneLife <= 0)
{
return;
}
if (KillEmyNums == 0) //过关时的效果
{
if ( m_EnterNextLevelTime == 0 )
{
m_EnterNextLevelTime = GetTickCount();
//敌方装备初始化
for (int 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;
}
}
if (GetTickCount()-m_EnterNextLevelTime < 3000)
{
return;
}
}
RECT rect;
int i = 0;
for (i = 0; i < m_iEmyNums; i++)
{
if( dEmyPlane.DevRect[i].left<=0 || dEmyPlane.DevRect[i].left>=ScreenW ||
dEmyPlane.DevRect[i].top<=0 || dEmyPlane.DevRect[i].top>=ScreenH )
{
dEmyPlane.bDeadFlag[i] = 1;
}
if (dEmyPlane.bDeadFlag[i] != 1) //敌机未毁
{
switch (EmyType[i])
{
case 0://敌机2
GetRect( &rect, dEmyPlane.DevRect[i].left, dEmyPlane.DevRect[i].top, 50, 57);
BitBlt(g_hBufDC,rect.left-10 ,rect.top-10,ScreenW,ScreenH,
g_EmyPlane2DC,0,0,SRCINVERT);
dEmyPlane.DevRect[i].top +=dEmyPlane.MoveSpeed[i];
dEmyPlane.DevRect[i].left +=dEmyPlane.MoveWay[i];
break;
case 1://子弹1
GetRect( &rect, dEmyPlane.DevRect[i].left, dEmyPlane.DevRect[i].top, 8, 8);
BitBlt(g_hBufDC,rect.left ,rect.top,ScreenW,ScreenH,
g_EmyBullet1,0,0,SRCINVERT);
dEmyPlane.DevRect[i].top += dEmyPlane.MoveSpeed[i] + 2;
dEmyPlane.DevRect[i].left += dEmyPlane.MoveWay[i];
break;
case 2://敌机1(自杀型)
GetRect( &rect, dEmyPlane.DevRect[i].left, dEmyPlane.DevRect[i].top, 50, 57);
BitBlt(g_hBufDC,rect.left-10 ,rect.top-10,ScreenW,ScreenH,
dEmyPlane.hDevDC,0,0,SRCINVERT);
dEmyPlane.DevRect[i].top += dEmyPlane.MoveSpeed[i] + 2;
dEmyPlane.DevRect[i].left += dEmyPlane.MoveWay[i];
break;
case 3://子弹2
GetRect( &rect, dEmyPlane.DevRect[i].left, dEmyPlane.DevRect[i].top, 26, 28);
BitBlt(g_hBufDC,rect.left-10 ,rect.top-10,ScreenW,ScreenH,
g_EmyBullet2,0,0,SRCINVERT);
dEmyPlane.DevRect[i].top += dEmyPlane.MoveSpeed[i];
dEmyPlane.DevRect[i].left += dEmyPlane.MoveWay[i];
break;
}
}
if ( dEmyPlane.bDeadFlag[i] == 1 )
{
if( m_bSeeBoss )
{
/* dEmyPlane.DevRect[i].left = (int)(ScreenW*((long)rand()/32767.0)) + 50;
dEmyPlane.DevRect[i].top = (int)(35*((long)rand()/32767.0)) - 30;
dEmyPlane.MoveSpeed[i] = (int)(4*((long)rand()/32767.0)) + 1;
dEmyPlane.MoveWay[i] = (int)(3*((long)rand()/32767.0))-1;//-1,0,1
dEmyPlane.bDeadFlag[i] = 0;
EmyType[i] = 3;*/
return;
}
dEmyPlane.DevRect[i].left = (int)(ScreenW*((long)rand()/32767.0)) + 50;
dEmyPlane.DevRect[i].top = (int)(35*((long)rand()/32767.0)) - 30;
dEmyPlane.MoveSpeed[i] = (int)(4*((long)rand()/32767.0)) + 1;
dEmyPlane.MoveWay[i] = (int)(3*((long)rand()/32767.0))-1;//-1,0,1
//敌机类型
// FoeType[i]=(int)(4*((long)rand()/32767.0));//0,1,2,3
// FoeDead[i]=1; //敌人复活
dEmyPlane.bDeadFlag[i] = 0;
if ( KillEmyNums > 60 )
{
EmyType[i] = (int)(4*((long)rand()/32767.0));//0,1,2,3
}
else if ( KillEmyNums > 40 )
{
EmyType[i] = (int)(3*((long)rand()/32767.0));//0,1,2
}
else if ( KillEmyNums > 20)
{
EmyType[i] = (int)(2*((long)rand()/32767.0));//0,1,
}
else
{
EmyType[i] = 0;
}
}
}
}
//游戏检测
void CGame::Check()
{
int b=0;
//检测敌机是否被击落
for (int e=0; e<m_iEmyNums; e++)
{
//敌人已消灭
if (dEmyPlane.bDeadFlag[e] == 1)
continue;
switch (EmyType[e])
{
case 0:
case 2://是敌机
//敌机不在窗口内
if (TRUE == IsOutRect(CPoint(dEmyPlane.DevRect[e].left,dEmyPlane.DevRect[e].top)))
continue;
for (b=0; b<DEVNUMS; b++)
{
//检测左子弹
if (FALSE == IsOutRect(CPoint(dBulletL.DevRect[b].left,dBulletL.DevRect[b].top)))
{
if ( abs(dEmyPlane.DevRect[e].left-dBulletL.DevRect[b].left+15)<15 &&
abs(dEmyPlane.DevRect[e].top-dBulletL.DevRect[b].top+11)<15 )
{
PlaySound(MAKEINTRESOURCE(IDR_WAVE_BOMB),AfxGetApp()->m_hInstance,SND_RESOURCE|SND_ASYNC);
dEmyPlane.bDeadFlag[e] = 1; //使敌机销毁
dBulletL.DevRect[b].top = 0; //使子弹消失
dEmyBlast.DevRect[e].left = dEmyPlane.DevRect[e].left - 10; //火焰坐标
dEmyBlast.DevRect[e].top = dEmyPlane.DevRect[e].top - 8; //火焰坐标
EmyBlastType[e] = 1; //火焰状态
//敌机损失数量++
KillEmyNums++;
TotalKillNums++;
}
}
//检测右子弹
if (FALSE == IsOutRect(CPoint(dBulletR.DevRect[b].left,dBulletR.DevRect[b].top)))
{
if ( abs(dEmyPlane.DevRect[e].left-dBulletR.DevRect[b].left+15)<15 &&
abs(dEmyPlane.DevRect[e].top-dBulletR.DevRect[b].top+11)<15 )
{
PlaySound(MAKEINTRESOURCE(IDR_WAVE_BOMB),AfxGetApp()->m_hInstance,SND_RESOURCE|SND_ASYNC);
dEmyPlane.bDeadFlag[e] = 1; //使敌机销毁
dBulletR.DevRect[b].top = 0; //使子弹消失
dEmyBlast.DevRect[e].left = dEmyPlane.DevRect[e].left - 10; //火焰坐标
dEmyBlast.DevRect[e].top = dEmyPlane.DevRect[e].top - 8; //火焰坐标
EmyBlastType[e] = 1; //火焰状态
//敌机损失数量++
KillEmyNums++;
TotalKillNums++;
}
}
}
break;
case 1:
case 3://是子弹
break;
}
}
//检测我机是否撞毁
for (int p=0; p<m_iEmyNums; p++)
{
//超级用户,打不死哈哈
// if(TRUE == m_iniSuperUser) break;
//我机重新初始化的时候
if(TRUE == m_bNewReset) break;
if(dEmyPlane.bDeadFlag[p]==1)
continue;
if(IsOutRect(CPoint(dEmyPlane.DevRect[p].left,dEmyPlane.DevRect[p].top)))
continue;
switch (EmyType[p])
{
case 1:
if ( abs(dPlane.DevRect[0].left-dEmyPlane.DevRect[p].left+21)<15 &&
abs(dPlane.DevRect[0].top-dEmyPlane.DevRect[p].top+26)<12 )
{
PlaySound(MAKEINTRESOURCE(IDR_WAVE_BOMB),AfxGetApp()->m_hInstance,SND_RESOURCE|SND_ASYNC);
dEmyPlane.bDeadFlag[p]=1;
BusPos[0].x=dEmyPlane.DevRect[p].left-29;
BusPos[0].y=dEmyPlane.DevRect[p].top-29;
BlastType = 1;
dPlane.bDeadFlag[0] = 1;
//我机飞机数量--,被击中
nPlaneLife--;
//损失总数++
// m_iTotalPlane++;
}
break;
case 3: //子弹
if ( abs(dPlane.DevRect[0].left-dEmyPlane.DevRect[p].left+21)<15 &&
abs(dPlane.DevRect[0].top-dEmyPlane.DevRect[p].top+26)<12 )
{
PlaySound(MAKEINTRESOURCE(IDR_WAVE_BOMB),AfxGetApp()->m_hInstance,SND_RESOURCE|SND_ASYNC);
dEmyPlane.bDeadFlag[p]=1;
BusPos[0].x=dEmyPlane.DevRect[p].left-29;
BusPos[0].y=dEmyPlane.DevRect[p].top-29;
BlastType = 1;
dPlane.bDeadFlag[0] = 1;
//我机飞机数量--,被击中
nPlaneLife--;
//损失总数++
// m_iTotalPlane++;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -