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

📄 game.cpp

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