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

📄 game.cpp

📁 借鉴他人的成果(包括图片等资源和一些算法)进行了射击游戏内容的修改和开发环境的转换。
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// Game.cpp: implementation of the CGame class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "TestGame.h"
#include "Game.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
/////////////////////////////////
void TransparentBlt2( HDC hdcDest,      // 目标DC
					 int nXOriginDest,   // 目标X偏移
					 int nYOriginDest,   // 目标Y偏移
					 int nWidthDest,     // 目标宽度
					 int nHeightDest,    // 目标高度
					 HDC hdcSrc,         // 源DC
					 int nXOriginSrc,    // 源X起点
					 int nYOriginSrc,    // 源Y起点
					 int nWidthSrc,      // 源宽度
					 int nHeightSrc,     // 源高度
					 UINT crTransparent  // 透明色,COLORREF类型
					 )
{
	HBITMAP hOldImageBMP, hImageBMP = CreateCompatibleBitmap(hdcDest, nWidthDest, nHeightDest);	// 创建兼容位图
	HBITMAP hOldMaskBMP, hMaskBMP = CreateBitmap(nWidthDest, nHeightDest, 1, 1, NULL);			// 创建单色掩码位图
	HDC		hImageDC = CreateCompatibleDC(hdcDest);
	HDC		hMaskDC = CreateCompatibleDC(hdcDest);
	hOldImageBMP = (HBITMAP)SelectObject(hImageDC, hImageBMP);
	hOldMaskBMP = (HBITMAP)SelectObject(hMaskDC, hMaskBMP);
	
	// 将源DC中的位图拷贝到临时DC中
	if (nWidthDest == nWidthSrc && nHeightDest == nHeightSrc)
		BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hdcSrc, nXOriginSrc, nYOriginSrc, SRCCOPY);
	else
		StretchBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, 
		hdcSrc, nXOriginSrc, nYOriginSrc, nWidthSrc, nHeightSrc, SRCCOPY);
	
	// 设置透明色
	SetBkColor(hImageDC, crTransparent);
	
	// 生成透明区域为白色,其它区域为黑色的掩码位图
	BitBlt(hMaskDC, 0, 0, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCCOPY);
	
	// 生成透明区域为黑色,其它区域保持不变的位图
	SetBkColor(hImageDC, RGB(0,0,0));
	SetTextColor(hImageDC, RGB(255,255,255));
	BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);
	
	// 透明部分保持屏幕不变,其它部分变成黑色
	SetBkColor(hdcDest,RGB(0xff,0xff,0xff));
	SetTextColor(hdcDest,RGB(0,0,0));
	BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);
	
	// "或"运算,生成最终效果
	BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCPAINT);
	
	SelectObject(hImageDC, hOldImageBMP);
	DeleteDC(hImageDC);
	SelectObject(hMaskDC, hOldMaskBMP);
	DeleteDC(hMaskDC);
	DeleteObject(hImageBMP);
	DeleteObject(hMaskBMP);
	
}

//////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------
//函数名:	GetModuleDir()
//入口参数:	无
//出口参数:	无
//返回值:	无
//日期:		2002.3.16
//说明:		获得当前模块的路径
//----------------------------------------------------------------------
CString GetModuleDir()
{
	CString  strModule;
	TCHAR szFullPath[MAX_PATH];
	TCHAR szdrive[MAX_PATH];
	TCHAR szdir[MAX_PATH];
	::GetModuleFileName(NULL,szFullPath,MAX_PATH);
	_splitpath(szFullPath,szdrive,szdir,NULL,NULL);
	strModule.Format(_T("%s%s"),szdrive,szdir);
	return strModule;
}
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CGame::CGame(CWnd* pWnd)
{
	pGWnd = pWnd;	
}

CGame::~CGame()
{	
	if(m_pThread)
	{
		//结束线程
		m_ExistEvent.SetEvent();
		Sleep(300);
	}		

	if ( g_hBufDC != NULL )
	{ 
		DeleteDC(g_hBufDC);
	}
	if ( g_hMapDC != NULL )
	{ 
		DeleteDC(g_hMapDC);
	}
	if ( g_hBusDC != NULL )
	{ 
		DeleteDC(g_hBusDC);
	}
	if ( g_hLifeDC != NULL )
	{
		DeleteDC(g_hLifeDC);
	}
	if ( g_hGameOverDC != NULL )
	{
		DeleteDC(g_hGameOverDC);
	}
	if ( g_hBomDC != NULL )
	{
		DeleteDC(g_hBomDC);
	}

	if ( dPlane.hDevDC != NULL )
	{ 
		DeleteDC(dPlane.hDevDC);
	}
	if ( dBulletL.hDevDC != NULL )
	{ 
		DeleteDC(dBulletL.hDevDC);
	}
	if ( dBulletR.hDevDC != NULL )
	{ 
		DeleteDC(dBulletR.hDevDC);
	}
	if ( dBom.hDevDC != NULL )
	{ 
		DeleteDC(dBom.hDevDC);
	}
	
	if ( dEmyPlane.hDevDC != NULL )
	{ 
		DeleteDC(dEmyPlane.hDevDC);
	}
	if ( dEmyBlast.hDevDC != NULL )
	{ 
		DeleteDC(dEmyBlast.hDevDC);
	}
	if ( dEmyBullet.hDevDC != NULL )
	{ 
		DeleteDC(dEmyBullet.hDevDC);
	}
	if ( dEmyBom.hDevDC != NULL )
	{ 
		DeleteDC(dEmyBom.hDevDC);
	}
	if ( g_EmyPlane2DC != NULL )
	{
		DeleteDC(g_EmyPlane2DC);
	}
	if ( g_EmyBullet1 != NULL )
	{
		DeleteDC(g_EmyBullet1);
	}
	if ( g_EmyBullet2 != NULL )
	{
		DeleteDC(g_EmyBullet2);
	}

	if ( dEmyBoss.hDevDC != NULL )
	{
		DeleteDC(dEmyBoss.hDevDC);
	}
	if ( dEmyBossBal.hDevDC != NULL )
	{
		DeleteDC(dEmyBossBal.hDevDC);
	}
	if ( g_EmyBossBlast != NULL )
	{
		DeleteDC(g_EmyBossBlast);
	}

}

BOOL CGame::InitialGame()
{
	HBITMAP hBitMap = NULL;
	CString strTempFile = "";

	HDC hDC;
	hDC = GetDC(pGWnd->m_hWnd);	
	
	g_hBufDC = CreateCompatibleDC(hDC);	
	strTempFile = GetModuleDir() + "\\resource\\bufPC.bmp";
	hBitMap = SHLoadDIBitmap(strTempFile);		
	SelectObject(g_hBufDC,hBitMap);

	g_hMapDC = CreateCompatibleDC(hDC);	
	strTempFile = GetModuleDir() + "\\resource\\map1.bmp";
	hBitMap = SHLoadDIBitmap(strTempFile);		
	SelectObject(g_hMapDC,hBitMap);

	g_hLifeDC = CreateCompatibleDC(hDC);	
	strTempFile = GetModuleDir() + "\\resource\\life.bmp";
	hBitMap = SHLoadDIBitmap(strTempFile);		
	SelectObject(g_hLifeDC,hBitMap);

	g_hGameOverDC = CreateCompatibleDC(hDC);	
	strTempFile = GetModuleDir() + "\\resource\\GameEnd.bmp";
	hBitMap = SHLoadDIBitmap(strTempFile);		
	SelectObject(g_hGameOverDC,hBitMap);

	//我方装备初始化
	dPlane.hDevDC = CreateCompatibleDC(hDC);	
	strTempFile = GetModuleDir() + "\\resource\\Center.bmp";
	hBitMap = SHLoadDIBitmap(strTempFile);		
	SelectObject(dPlane.hDevDC,hBitMap);	

	g_hBusDC = CreateCompatibleDC(hDC);	
	strTempFile = GetModuleDir() + "\\resource\\dead.bmp";
	hBitMap = SHLoadDIBitmap(strTempFile);		
	SelectObject(g_hBusDC,hBitMap);

	g_hBomDC = CreateCompatibleDC(hDC);	
	strTempFile = GetModuleDir() + "\\resource\\thunder.bmp";
	hBitMap = SHLoadDIBitmap(strTempFile);		
	SelectObject(g_hBomDC,hBitMap);

	dBulletL.hDevDC = CreateCompatibleDC(hDC);	
	strTempFile = GetModuleDir() + "\\resource\\ball.bmp";
	hBitMap = SHLoadDIBitmap(strTempFile);		
	SelectObject(dBulletL.hDevDC,hBitMap);
	dBulletR.hDevDC = CreateCompatibleDC(hDC);	
	strTempFile = GetModuleDir() + "\\resource\\ball.bmp";
	hBitMap = SHLoadDIBitmap(strTempFile);		
	SelectObject(dBulletR.hDevDC,hBitMap);
	
	dBom.hDevDC = CreateCompatibleDC(hDC);	
	strTempFile = GetModuleDir() + "\\resource\\thunder.bmp";
	hBitMap = SHLoadDIBitmap(strTempFile);		
	SelectObject(dBom.hDevDC,hBitMap);
	
	//敌方装备初始化
	dEmyPlane.hDevDC = CreateCompatibleDC(hDC);	
	strTempFile = GetModuleDir() + "\\resource\\foe1.bmp";
	hBitMap = SHLoadDIBitmap(strTempFile);		
	SelectObject(dEmyPlane.hDevDC,hBitMap);	

	dEmyBlast.hDevDC = CreateCompatibleDC(hDC);	
	strTempFile = GetModuleDir() + "\\resource\\dead.bmp";
	hBitMap = SHLoadDIBitmap(strTempFile);		
	SelectObject(dEmyBlast.hDevDC,hBitMap);	

	g_EmyPlane2DC = CreateCompatibleDC(hDC);	
	strTempFile = GetModuleDir() + "\\resource\\foe2.bmp";
	hBitMap = SHLoadDIBitmap(strTempFile);		
	SelectObject(g_EmyPlane2DC,hBitMap);

	g_EmyBullet1 = CreateCompatibleDC(hDC);	
	strTempFile = GetModuleDir() + "\\resource\\ball1.BMP";
	hBitMap = SHLoadDIBitmap(strTempFile);		
	SelectObject(g_EmyBullet1,hBitMap);

	g_EmyBullet2 = CreateCompatibleDC(hDC);	
	strTempFile = GetModuleDir() + "\\resource\\ball2.BMP";
	hBitMap = SHLoadDIBitmap(strTempFile);		
	SelectObject(g_EmyBullet2,hBitMap);

	//Boss
	dEmyBoss.hDevDC = CreateCompatibleDC(hDC);	
	strTempFile = GetModuleDir() + "\\resource\\Boss1.bmp";
	hBitMap = SHLoadDIBitmap(strTempFile);		
	SelectObject(dEmyBoss.hDevDC,hBitMap);	

	dEmyBossBal.hDevDC = CreateCompatibleDC(hDC);	
	strTempFile = GetModuleDir() + "\\resource\\bossbal1.bmp";
	hBitMap = SHLoadDIBitmap(strTempFile);		
	SelectObject(dEmyBossBal.hDevDC,hBitMap);	

	g_EmyBossBlast = CreateCompatibleDC(hDC);	
	strTempFile = GetModuleDir() + "\\resource\\dead.bmp";
	hBitMap = SHLoadDIBitmap(strTempFile);		
	SelectObject(g_EmyBossBlast,hBitMap);	
	
	DeleteObject(hBitMap);
	ReleaseDC(pGWnd->m_hWnd,hDC);
	hDC = NULL;
	
//	VOpen();
	m_iLevel = 1;
	MoveSpeed = 0;

	RestAll();

	m_pThread = NULL;
	//启动播放线程	
	m_pThread =	AfxBeginThread( PlayThread, 
								this
								//		THREAD_PRIORITY_BELOW_NORMAL
								);
	if(m_pThread == NULL)
	{
		return FALSE;
	}	
	
	return TRUE;
}
//垂直方向开启屏幕效果
void CGame::VOpen()
{
	HDC hDC = GetDC(pGWnd->m_hWnd);
	RECT rc;
	GetWindowRect(pGWnd->m_hWnd,&rc);
	
	for (int m=0;m<121;m++)
	{
		BitBlt(hDC,0,rc.top,
			ScreenW,(rc.bottom-rc.top),
			g_hBufDC,0,rc.top,BLACKNESS);
		rc.top	  -= 2;
		rc.bottom += 2;
	//	::Sleep(5);
	}

	CString strTempFile = "";
	strTempFile = GetModuleDir() + "\\resource\\open.wav";	
	PlaySound (strTempFile,NULL,SND_FILENAME|SND_ASYNC);
	
	ReleaseDC(pGWnd->m_hWnd,hDC);
	hDC = NULL;
}

//画地图
void CGame::DrawMap()
{
	//背景贴图的偏移坐标
	static int mapposX=64, mapposY=64;
	mapposX--;
	if (mapposX<=0 ) mapposX=64;
	
	if (mapposY<=0) mapposY=64;
	if (mapposY>64) mapposY=1;
	
	for (int x=0; x<=(int)ScreenW/64; x++)
	{
		for (int y=0; y<=(int)ScreenH/64; y++)
		{
			RECT rect;
			GetRect(&rect, 64*x-mapposY, 64*y-mapposX, 64, 64);
			BitBlt(g_hBufDC,rect.left,rect.top,ScreenW,ScreenH,g_hMapDC,0,0,SRCCOPY);			
		}
	}

	
}
//填充一个RECT结构
void CGame::GetRect(RECT* rect, long left, long top, long width, long height)
{
	rect->left	 = left;
	rect->top	 = top;
	rect->right	 = left+width;
	rect->bottom = top+height;
	return;
}

//场景更换
void CGame::UpdateFrame()
{
/*	if (nPlaneLife <= 0)
	{
		return;
	}*/

	//开火:A键
	if(GetAsyncKeyState(0x41))
	{
		Fire();
	}

	//放雷:S键
	if(GetAsyncKeyState(0x53))	
		FlashScreen();
	
	DrawMap();
	Check();
	CheckBoss();
	DrawPlane();
	DrawBullet();
	DrawEmyPlane();
	DrawBlast();
	DrawEmyBoss();
	DrawScore();

	DrawFlip();

	PassLevel();
}

//画我机
void CGame::DrawPlane()
{
	if (nPlaneLife <= 0)
	{
		return;
	}

	static DWORD dOldTime = 0;
	if ( dPlane.bDeadFlag[0] == 1 && nPlaneLife > 0 )
	{
		dPlane.DevRect[0].left = ScreenW/2 - 25;
		dPlane.DevRect[0].top = ScreenH - 50;
		dOldTime = GetTickCount();
		m_bNewReset = TRUE;
		m_bCanControl = FALSE;		
		dPlane.bDeadFlag[0] = 0;
	}

	if (TRUE == m_bNewReset)
	{
		if (GetTickCount()>dOldTime+3000) //重新初始化,无敌时间3秒
		{
			m_iBomb = 4;
			m_bNewReset = FALSE;
		}
	}

	if (FALSE == m_bCanControl)
	{
		if (dPlane.DevRect[0].top > ScreenH - 150)	//飞机刚出现不受控制
			dPlane.DevRect[0].top -= dPlane.MoveSpeed[0];
		else
			m_bCanControl = TRUE;
	}
	else
	{
		//检测飞机控制键
		if(GetAsyncKeyState(VK_UP)) 
			ControlPlanePos(VK_UP);
		if(GetAsyncKeyState(VK_DOWN)) 
			ControlPlanePos(VK_DOWN);
		if(GetAsyncKeyState(VK_LEFT)) 
			ControlPlanePos(VK_LEFT);
		if(GetAsyncKeyState(VK_RIGHT)) 
			ControlPlanePos(VK_RIGHT);		
	}

	if (TRUE == m_bNewReset) //无敌时的闪烁效果
	{
		static int ot=0;	//延时
		if (GetTickCount()-ot > 30)
			ot = GetTickCount();
		else
			return;
	}
	
	//绘制飞机
	if ( dPlane.bDeadFlag[0] == 0 )
	{
		RECT rect;
	//	GetRect(&rect, 200, 300, 50, 60);
		rect = dPlane.DevRect[0];
		COLORREF crMask = RGB(0x00,0x00,0x00);
		BitBlt(g_hBufDC,rect.left,rect.top,ScreenW,ScreenH,dPlane.hDevDC ,0,0,SRCINVERT);
		//透明处理---为什么会很慢呢?????
	//	TransparentBlt2(g_hBufDC,rect.left,rect.top,ScreenW,ScreenH,dPlane.hDevDC ,0,0,ScreenW, ScreenH,crMask);
	}
	else
	{
		dPlane.DevRect[0].left = -100;
		dPlane.DevRect[0].top = -100;
	}//////////////////////////////*/
}

//画我机子弹
void CGame::DrawBullet()
{
	if (nPlaneLife <= 0)
	{
		return;
	}

	for (int i=0; i<DEVNUMS; i++)
	{
		RECT rcL,rcR;
		rcL.left	= dBulletL.DevRect[i].left;
		rcL.top		= dBulletL.DevRect[i].top;
		rcL.right	= rcL.left + 10;
		rcL.bottom	= rcL.top + 20;
		rcR.left	= dBulletR.DevRect[i].left;
		rcR.top		= dBulletR.DevRect[i].top;
		rcR.right	= rcR.left + 10;
		rcR.bottom	= rcR.top + 20;
		
		BitBlt(g_hBufDC,rcL.left,rcL.top,ScreenW,ScreenH,dBulletL.hDevDC,0,0,SRCINVERT);
		BitBlt(g_hBufDC,rcR.left,rcR.top,ScreenW,ScreenH,dBulletR.hDevDC,0,0,SRCINVERT);
		
		dBulletL.DevRect[i].left --;
		dBulletL.DevRect[i].top -= 26;

		dBulletR.DevRect[i].left ++;
		dBulletR.DevRect[i].top -= 26;
	}
}
//开火
void CGame::Fire()
{
	if (nPlaneLife <= 0)
	{
		return;
	}

	static int newtime,oldtime = GetTickCount();
	newtime = GetTickCount();
	if (newtime > oldtime+150)
	{
		PlaySound(MAKEINTRESOURCE(IDR_WAVE_SHOT),AfxGetApp()->m_hInstance,SND_RESOURCE|SND_ASYNC);
		
		oldtime = newtime;
		dBulletL.DevRect[m_iBallNum].left = dPlane.DevRect[0].left + 10;
		dBulletL.DevRect[m_iBallNum].top = dPlane.DevRect[0].top;
		dBulletR.DevRect[m_iBallNum].left = dPlane.DevRect[0].left + 30;
		dBulletR.DevRect[m_iBallNum].top = dPlane.DevRect[0].top;

		m_iBallNum ++;
		
		if (m_iBallNum == DEVNUMS) 
			m_iBallNum = 0;			
	}
	
}

//画BOSS子弹
void CGame::DrawEmyBossBal()
{
	RECT rect;
	int i;
	
	switch(m_iLevel)
	{
	case 5:
	case 2:
	case 3:
	case 4:
	case 1:
		//子弹消失了,重发
		if(TRUE == m_bBossBalClr)
		{
			m_bBossBalClr = FALSE;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -