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

📄 game.cpp

📁 一款不错的飞机模拟游戏
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	wcscpy(tcWaveFile,tcAppExePath);
	wcscat(tcWaveFile,TEXT("Q11\\open.wav"));
	PlaySound (tcWaveFile,NULL,SND_FILENAME|SND_ASYNC);	

	HDC hDC = GetDC(hWnd);

	RECT rc;
	GetClientRect(hWnd,&rc);

	int a,b;
	#if _WIN32_WCE
	a = 101;
	b = 4;
	#else
	a = 50;
	b = 10;
	#endif
	for (int m=0;m<a;m++)
	{
		BitBlt(hDC,0,0,rc.left,ScreenH,g_hBufDC,0,0,BLACKNESS);
		//BitBlt(hDC,rc.right,0,(ScreenW - rc.right),ScreenH,
		//	   g_hBufDC,0,0,BLACKNESS);
		rc.left  += b;
		rc.right -= b;
		Sleep(1);
	}

	//用于绘制“请稍候……”
	rc.left		= 0;
	rc.top		= ScreenH / 2;
	rc.right	= ScreenW;
	rc.bottom	= ScreenH;
	SetTextColor(hDC,0x0000ffff);	//黄色
	SetBkMode(hDC,TRANSPARENT);	//设置透明背景
	if(m_iLevel > 1)
	{
		TCHAR str[256] = {'\0'};
		swprintf(str,TEXT("祝贺通过第%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(hWnd,hDC);
	hDC = NULL;

	Sleep(1000);

}
//------------------------------------------------------------------------------
//过关
void CGame::PassLevel()
{
	//!!!!!!!调试语句!!!!!!!!!!!
	//m_iLevel = 2;
	//!!!!!!!用完屏蔽!!!!!!!!!!!

	HDC hDC = GetDC(hWnd);

	if(m_iLevel > 5)
	{
		//游戏结束,打了通关=3
		m_iGameStatus = 3;
		m_bResetGame = TRUE;
		return;
	}
	 
	HBITMAP hBitMap = NULL;
	TCHAR tcTempFile[MAX_PATH]={'\0'};

	movespeed ++;
	m_iFoeBossBlood = PassBlood*m_iLevel;
	m_iFoeDead = 0;

	//BOSS和BOSS子弹贴图部分未完成
	switch(m_iLevel)
	{
	case 0:
		break;
	case 1: 
		wcscpy(tcTempFile,tcAppExePath);
		wcscat(tcTempFile,TEXT("Q11\\map1.bmp"));
		hBitMap = SHLoadDIBitmap(tcTempFile);	
		SelectObject(g_hMapDC,hBitMap);
		wcscpy(tcTempFile,tcAppExePath);
		wcscat(tcTempFile,TEXT("Q11\\boss1.bmp"));
		hBitMap = SHLoadDIBitmap(tcTempFile);	
		SelectObject(g_hFoeBossDC,hBitMap);
		LClose();
		break;
	case 2:
		wcscpy(tcTempFile,tcAppExePath);
		wcscat(tcTempFile,TEXT("Q11\\map2.bmp"));
		hBitMap = SHLoadDIBitmap(tcTempFile);	
		SelectObject(g_hMapDC,hBitMap);
		wcscpy(tcTempFile,tcAppExePath);
		wcscat(tcTempFile,TEXT("Q11\\boss2.bmp"));
		hBitMap = SHLoadDIBitmap(tcTempFile);	
		SelectObject(g_hFoeBossDC,hBitMap);
		VClose();
		break;
	case 3:
		wcscpy(tcTempFile,tcAppExePath);
		wcscat(tcTempFile,TEXT("Q11\\map3.bmp"));
		hBitMap = SHLoadDIBitmap(tcTempFile);	
		SelectObject(g_hMapDC,hBitMap);
		wcscpy(tcTempFile,tcAppExePath);
		wcscat(tcTempFile,TEXT("Q11\\boss1.bmp"));
		hBitMap = SHLoadDIBitmap(tcTempFile);	
		SelectObject(g_hFoeBossDC,hBitMap);
		LClose();
		break;
	case 4:
		wcscpy(tcTempFile,tcAppExePath);
		wcscat(tcTempFile,TEXT("Q11\\map4.bmp"));
		hBitMap = SHLoadDIBitmap(tcTempFile);	
		SelectObject(g_hMapDC,hBitMap);
		wcscpy(tcTempFile,tcAppExePath);
		wcscat(tcTempFile,TEXT("Q11\\boss1.bmp"));
		hBitMap = SHLoadDIBitmap(tcTempFile);	
		SelectObject(g_hFoeBossDC,hBitMap);
		VClose();
		break;
	case 5:
		wcscpy(tcTempFile,tcAppExePath);
		wcscat(tcTempFile,TEXT("Q11\\map5.bmp"));
		hBitMap = SHLoadDIBitmap(tcTempFile);	
		SelectObject(g_hMapDC,hBitMap);
		wcscpy(tcTempFile,tcAppExePath);
		wcscat(tcTempFile,TEXT("Q11\\boss1.bmp"));
		hBitMap = SHLoadDIBitmap(tcTempFile);	
		SelectObject(g_hFoeBossDC,hBitMap);
		LClose();
		break;
	}

	wcscpy(tcTempFile,tcAppExePath);
	wcscat(tcTempFile,TEXT("Q11\\bossbal1.bmp"));
	hBitMap = SHLoadDIBitmap(tcTempFile);	
	SelectObject(g_hFoeBossBalDC,hBitMap);
	m_bMoveBossRight = TRUE;


}

//------------------------------------------------------------------------------
//画敌机BOSS
void CGame::DrawFoeBoss()
{
	if( m_iFoeDead <= (PassFoe * m_iLevel) )
		return;
	
	m_bSeeBoss = TRUE;

	if(m_iFoeBossBlood <= 0)
	{
		m_bSeeBoss = FALSE;
		m_iLevel ++;
		PassLevel();
		return;
	}
	
	RECT rect;
	
	switch(m_iLevel)
	{
	case 1:	//第一关
		GetRect(&rect,m_pFoeBossPos.x,m_pFoeBossPos.y,100,120);
		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;

	case 2:
	case 3:
	case 4:
	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

	DrawFoeBossBal();

	m_iFoeBossSpeed = (int)(4*((long)rand()/32767.0))+1;
	m_iFoeBossType=(int)(2*((long)rand()/32767.0));//0,1
	
	

}
//------------------------------------------------------------------------------
//画BOSS子弹
void CGame::DrawFoeBossBal()
{
	RECT rect;
	int i;
	
	switch(m_iLevel)
	{
	case 1:
	case 2:
	case 3:
	case 4:
	case 5:
		//子弹消失了,重发
		if(TRUE == m_bBossBalClr)
		{
			m_bBossBalClr = FALSE;
		
			for(i=0;i<m_iBossTotalBalNum;i++)
			{
				m_pFoeBossBalPos[i].x = m_pFoeBossPos.x + 50;
				m_pFoeBossBalPos[i].y = m_pFoeBossPos.y + 120;

			}
			
			PlaySound(MAKEINTRESOURCE(IDR_WAVE_BOSSBALL),g_hInst,SND_RESOURCE|SND_ASYNC);	//子弹声效

		}
		else
		{
			for(i=0;i<m_iBossTotalBalNum;i++)
			{
				if (m_iBossBalClr >= m_iBossTotalBalNum) 
				{
					m_bBossBalClr = TRUE;
					m_iBossBalClr = 0;	
				}
				m_iFoeBossBalWay[i] = rand()%50-10; //-40~40
				m_iFoeBossBalSpeed[i] = rand()%20;	//0~20
				
				GetRect(&rect, m_pFoeBossBalPos[i].x, m_pFoeBossBalPos[i].y, 25, 25);
				BitBlt(g_hBufDC,rect.left,rect.top,ScreenW,ScreenH,g_hFoeBossBalDC,0,0,SRCINVERT);		
				
				if(m_pFoeBossPos.x < ScreenW/2)
				{
					m_pFoeBossBalPos[i].x +=m_iFoeBossBalWay[i];
					m_pFoeBossBalPos[i].y +=m_iFoeBossBalSpeed[i]+movespeed;
				}
				else if(m_pFoeBossPos.x > ScreenW/2)
				{
					m_pFoeBossBalPos[i].x -= m_iFoeBossBalWay[i];
					m_pFoeBossBalPos[i].y += m_iFoeBossBalSpeed[i]+movespeed;
				}

				if( m_pFoeBossBalPos[i].x>ScreenW+100 || 
					m_pFoeBossBalPos[i].x<-100 ||
					m_pFoeBossBalPos[i].y>ScreenH+120 ||
					m_pFoeBossBalPos[i].y<-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
		
}
//------------------------------------------------------------------------------
//画背景文字
void CGame::DrawScore()
{
	TCHAR str[256] = {'\0'};
	RECT rc;

	//开始
	if(0 == m_iGameStatus)
	{
		HDC hDC = GetDC(hWnd);		
		SetBkMode(hDC, TRANSPARENT);
		SetTextColor(hDC, 0x0000ffff); 
		int	iHigh;
		#if _WIN32_WCE
		rc.left = ScreenW / 6;
		iHigh = 12;
		#else
		rc.left = ScreenW / 4;
		iHigh = 20;
		#endif
		rc.right = ScreenW;
		rc.top = ScreenH / 8;
		rc.bottom = ScreenH;
		DrawText(hDC,TEXT("【PC 缺省操作方式】"),-1,&rc,DT_LEFT);
		rc.top    += iHigh;
		rc.bottom += iHigh;
		DrawText(hDC,TEXT("开 始: Enter"),-1,&rc,DT_LEFT);
		rc.top    += iHigh;
		rc.bottom += iHigh;
		DrawText(hDC,TEXT("移 动: Up, Down, Left, Right或鼠标"),-1,&rc,DT_LEFT);
		rc.top    += iHigh;
		rc.bottom += iHigh;
		DrawText(hDC,TEXT("子 弹: 自动或设置"),-1,&rc,DT_LEFT);
		rc.top    += iHigh;
		rc.bottom += iHigh;
		DrawText(hDC,TEXT("炸 弹: Space"),-1,&rc,DT_LEFT);
		rc.top    += iHigh;
		rc.bottom += iHigh;
		DrawText(hDC,TEXT("调 速: +, -"),-1,&rc,DT_LEFT);
		rc.top    += iHigh;
		rc.bottom += iHigh;
		DrawText(hDC,TEXT("返 回: Escape"),-1,&rc,DT_LEFT);

		rc.top    += 2*iHigh;
		rc.bottom += 2*iHigh;
		DrawText(hDC,TEXT("【PPC (WINCE) 操作方式】"),-1,&rc,DT_LEFT);
		rc.top    += iHigh;
		rc.bottom += iHigh;
		DrawText(hDC,TEXT("开 始: 单击触摸屏"),-1,&rc,DT_LEFT);
		rc.top    += iHigh;
		rc.bottom += iHigh;
		DrawText(hDC,TEXT("移 动: 触摸笔上、下、左、右"),-1,&rc,DT_LEFT);
		rc.top    += iHigh;
		rc.bottom += iHigh;
		DrawText(hDC,TEXT("子 弹: 自动"),-1,&rc,DT_LEFT);
		rc.top    += iHigh;
		rc.bottom += iHigh;
		DrawText(hDC,TEXT("炸 弹: 双击触摸屏"),-1,&rc,DT_LEFT);
		rc.top    += iHigh;
		rc.bottom += iHigh;
		DrawText(hDC,TEXT("调 速: 不能调di"),-1,&rc,DT_LEFT);
		rc.top    += iHigh;
		rc.bottom += iHigh;
		DrawText(hDC,TEXT("返 回: “退出”菜单"),-1,&rc,DT_LEFT);

		rc.top    += 2*iHigh;
		rc.bottom += 2*iHigh;
		DrawText(hDC,TEXT("作者:oshj 2003.12 西安"),-1,&rc,DT_LEFT);
		rc.top    += iHigh;
		rc.bottom += iHigh;
		DrawText(hDC,TEXT("Email:oshj@21cn.com"),-1,&rc,DT_LEFT);
		
		rc.top    += 2*iHigh;
		rc.bottom += 2*iHigh;
		SetTextColor(hDC, RGB(255,0,0)); 
		#if _WIN32_WCE
			DrawText(hDC,TEXT("点击触摸屏开始"),-1,&rc,DT_LEFT);
		#else
			DrawText(hDC,TEXT("按回车或单击鼠标左键开始"),-1,&rc,DT_LEFT);
		#endif

		ReleaseDC(hWnd,hDC);
		hDC = NULL;

	}

	//游戏中
	if(1 == m_iGameStatus)
	{
		SetBkMode(g_hBufDC, TRANSPARENT);
		SetTextColor(g_hBufDC, RGB(255,0,0));
		
		rc.right = ScreenW - 10;
		rc.left = rc.right - 200;
		#if _WIN32_WCE
		rc.bottom = ScreenH-26;
		#else
		rc.bottom = ScreenH-46;
		#endif
		rc.top = rc.bottom - 20;
		swprintf(str,TEXT("我机损失总数:%d"),m_iTotalPlane);
		DrawText(g_hBufDC,str,-1,&rc,DT_RIGHT);
		rc.top    -= 20;
		rc.bottom -= 20;
		swprintf(str,TEXT("击落敌机总数:%d"),m_iFoeTotalDead);
		DrawText(g_hBufDC,str,-1,&rc,DT_RIGHT);

		rc.left = 0;
		rc.right = 100;
		rc.top    += 20;
		rc.bottom += 20;
		swprintf(str,TEXT("我机剩余:%d"),m_iReMain);
		DrawText(g_hBufDC,str,-1,&rc,DT_LEFT);
		rc.top    -= 20;
		rc.bottom -= 20;
		swprintf(str,TEXT("我机炸弹:%d"),m_iBomb);
		DrawText(g_hBufDC,str,-1,&rc,DT_LEFT);
		if(TRUE == m_bSeeBoss)
		{
			rc.left = 10;
			rc.top  = 36;
			rc.right = 100;
			rc.bottom += 20;
			swprintf(str,TEXT("BOSS血:%d"),m_iFoeBossBlood);
			DrawText(g_hBufDC,str,-1,&rc,DT_LEFT);
		}
		
		rc.right = ScreenW - 10;
		rc.left = rc.right - 100;
		rc.top  = 36;
		rc.bottom = rc.top + 20;
		swprintf(str,TEXT("当前速度:%d"),movespeed);
		DrawText(g_hBufDC,str,-1,&rc,DT_RIGHT);
		rc.top += 20;
		rc.bottom += 20;
		swprintf(str,TEXT("当前关卡:%d"),m_iLevel);
		DrawText(g_hBufDC,str,-1,&rc,DT_RIGHT);

	}

	//结束
	if(2 == m_iGameStatus)
	{
		HDC hDC = GetDC(hWnd);		
		SetBkMode(hDC, TRANSPARENT);
		SetTextColor(hDC, 0x0000ffff); 

		rc.left = ScreenW / 4;
		rc.right = ScreenW;
		rc.top = ScreenH / 4;
		rc.bottom = ScreenH;
		DrawText(hDC,TEXT("GAME OVER!"),-1,&rc,DT_LEFT);
		rc.top    += 20;
		rc.bottom += 20;
		if(m_iLevel >= 5)
		{
			DrawText(hDC,TEXT("厉害呀,打了个通关^_^"),-1,&rc,DT_LEFT);
		}
		else
		{
			rc.top    += 20;
			rc.bottom += 20;
			DrawText(hDC,TEXT("很遗憾,你被电脑打败了"),-1,&rc,DT_LEFT);
			rc.top    += 20;
			rc.bottom += 20;
			swprintf(str,TEXT("你总共闯过:%d 关"),m_iLevel-1);
			DrawText(hDC,str,-1,&rc,DT_LEFT);
		}
		rc.top    += 20;
		rc.bottom += 20;
		swprintf(str,TEXT("总共击落敌机:%d 架"),m_iFoeTotalDead);
		DrawText(hDC,str,-1,&rc,DT_LEFT);
		rc.top    += 20;
		rc.bottom += 20;
		swprintf(str,TEXT("我机损失总数:%d 架"),m_iTotalPlane);
		DrawText(hDC,str,-1,&rc,DT_LEFT);
		
		rc.top    += 40;
		rc.bottom += 40;
		SetTextColor(hDC, RGB(255,0,0)); 
		#if _WIN32_WCE
			DrawText(hDC,TEXT("点击触摸屏继续"),-1,&rc,DT_LEFT);
			rc.top    += 20;
			rc.bottom += 20;
			DrawText(hDC,TEXT("点“退出”菜单返回"),-1,&rc,DT_LEFT);
		#else
			DrawText(hDC,TEXT("按回车或单击鼠标左键继续"),-1,&rc,DT_LEFT);
			rc.top    += 20;
			rc.bottom += 20;
			DrawText(hDC,TEXT("按 Escape 键返回"),-1,&rc,DT_LEFT);
		#endif

		ReleaseDC(hWnd,hDC);
		hDC = NULL;
	}

}
//------------------------------------------------------------------------------
//从配置文件中加载
void CGame::LoadFromIni()
{
	CGameSet *gameset = new struct CGameSet;
	ZeroMemory(gameset,sizeof(CGameSet));

	DWORD dwRd;

	HANDLE hf = CreateFile(iniFile, GENERIC_READ, FILE_SHARE_WRITE|FILE_SHARE_READ, NULL, 
			          OPEN_ALWAYS, 0, NULL);
	if (hf == INVALID_HANDLE_VALUE) return;
	
	SetFilePointer(hf, 0, NULL, FILE_BEGIN);
	ReadFile(hf, gameset, sizeof(CGameSet), &dwRd, NULL);

	if( 0==wcscmp(gameset->UserCur,TEXT("oshj")) ||
		0==wcscmp(gameset->UserCur,TEXT("OSHJ")) )
	{
		m_iniSuperUser = TRUE;	//超级用户,打不死哈哈
	}
	else
		m_iniSuperUser = FALSE;

	m_iniLevel = gameset->iLevelIndex;

	LoadAscii(m_iniUp,gameset->Key[0]);
	if( -1 == m_iniUp )
		wcscpy(&m_iniUp,gameset->Key[0]);

	LoadAscii(m_iniDown,gameset->Key[1]);
	if( -1 == m_iniDown )
		wcscpy(&m_iniDown,gameset->Key[1]);

	LoadAscii(m_iniLeft,gameset->Key[2]);
	if( -1 == m_iniLeft )
		wcscpy(&m_iniLeft,gameset->Key[2]);

	LoadAscii(m_iniRight,gameset->Key[3]);
	if( -1 == m_iniRight )
		wcscpy(&m_iniRight,gameset->Key[3]);

	LoadAscii(m_iniFire,gameset->Key[4]);
	if( -1 == m_iniFire )
		wcscpy(&m_iniFire,gameset->Key[4]);

	LoadAscii(m_iniThunder,gameset->Key[5]);
	if( -1 == m_iniThunder )
		wcscpy(&m_iniThunder,gameset->Key[5]);

	m_iniBombSel = atoi((char*)gameset->Key[6]); 

	if(1 == gameset->iAutoFire)
		m_iniAutoFire = TRUE;
	else
		m_iniAutoFire = FALSE;
	
	CloseHandle(hf);
	ZeroMemory(gameset,sizeof(CGameSet));
	if(NULL != gameset)
		delete gameset;
	

}
//------------------------------------------------------------------------------
//从配置文件中加载
void CGame::LoadAscii(TCHAR &sr,TCHAR *s)
{
	if( 0 == wcscmp(s,TEXT("SHIFT")) )
		sr = 0x10;
	else if( 0 == wcscmp(s,TEXT("CONTROL")) )
		sr = 0x11;
	else if( 0 == wcscmp(s,TEXT("SPACE")) )
		sr = 0x20;
	else if( 0 == wcscmp(s,TEXT("LEFT")) )
		sr = 0x25;
	else if( 0 == wcscmp(s,TEXT("UP")) )
		sr = 0x26;
	else if( 0 == wcscmp(s,TEXT("RIGHT")) )
		sr = 0x27;
	else if( 0 == wcscmp(s,TEXT("DOWN")) )
		sr = 0x28;
	else
		sr = -1;

}


⌨️ 快捷键说明

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