⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 game.cpp

📁 借鉴他人的成果(包括图片等资源和一些算法)进行了射击游戏内容的修改和开发环境的转换。
💻 CPP
📖 第 1 页 / 共 3 页
字号:
			
			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 + -