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

📄 game.cpp

📁 Win32项目,类似坦克大战的游戏"忘记喧嚣". 游戏的各系统完整,闪屏,道具.碰撞等等....推荐
💻 CPP
字号:
#include ".\game.h"

Game::Game(HWND hWnd)
{
	ga_hWnd = hWnd;
	InitGame();
}

Game::~Game(void)
{
	::DeleteDC(ga_bufdc);
	::DeleteDC(ga_mdc);
	::DeleteDC(ga_hdc);
	SAFE_DELETE(ui);
	SAFE_DELETE(map);
	SAFE_DELETE(prop);
	SAFE_DELETE(hero);
	for (int i=0; i<3; i++)
	{
		SAFE_DELETE(enemy[i]);
	}
}

void Game::InitGame()
{
	ga_hdc    = ::GetDC(ga_hWnd);
	ga_mdc    = ::CreateCompatibleDC(ga_hdc);
	ga_bufdc  = ::CreateCompatibleDC(ga_hdc);
	ga_bufMap = ::CreateCompatibleBitmap(ga_hdc, 640, 535);
	::SelectObject(ga_bufdc, ga_bufMap);

	ga_startTime = ::timeGetTime();
	ga_lastTime  = 0;
	ga_t1 = ga_startTime;
	ga_t2 = ga_startTime;
	ga_gameStart     = false;
	ga_gameInstruct  = false;
	ga_instructClose = false;
	ga_begin         = false;
	ga_exit          = false;
	ga_help          = false;
	ga_sound1        = false;
	ga_sound2        = false;
	ga_sound3        = false;
	ga_airdroping    = false;
	ga_enemyEnough   = false;
	ga_enemyIndex    = 0;
	ge_killNumber    = 0;
	ge_prekillNumber = -1;
	ga_airdropSpace  = 0;
	ga_propLiveSpace = 0;

	ui = new UI(ga_hdc, ga_mdc, ga_bufdc);
	map = new Map(ga_hdc, ga_mdc, ga_bufdc);
	prop = new Prop(ga_hdc, ga_mdc, ga_bufdc);
	hero = new Hero(ga_hdc, ga_mdc, ga_bufdc);
	hero->CreateTack();  // 以后修改 合适的情况调用一次

	for (int i=0; i<ENEMY_SUM_MAX; i++)
	{
		enemy[i] = NULL;
	}

	char *mapFileName = "../res/map/map1.map";
	map->LoadMaps(mapFileName);

	for (int j=0; j<ENEMY_SUM_MAX; j++)
	{
		if (enemy[j]==NULL)                                           // 生成敌人
		{			
			enemy[j] = new Enemy(ga_hdc, ga_mdc, ga_bufdc);
			enemy[j]->t_live = false;
		}
	}
	enemy[0]->CreateTack(60, 30);
}

void Game::RunGame(void)                                                // 游戏主体
{
	ga_lastTime = ::timeGetTime();
	if (ga_lastTime - ga_startTime>static_cast<DWORD>(50) )             // 主循环频率控制
	{
		if (!ga_gameStart)
		{
			StartGame();
		}
		else  // 点开始以后
		{
			if (!judge.GamePause())
			{
				ui->ShowBackground();
				map->ShowMaps();
				ui->ShowTackAttribute(hero);
				PlayGame();
				ui->ShowHarvest(ge_killNumber);
				map->ShowGress();
				ShowAirdrop();
			}
			else
			{
				ui->ShowGamePause();
			}
			if (ge_killNumber == 50)
			{
				ui->ShowGameComplete();
			}
			if (judge.GameOver(hero, enemy, map))
			{
				ui->ShowGameOver();
			}
			if (judge.SkyOpen())
			{
				ui->ShowCloud();
			}
		}
		::BitBlt(ga_hdc, 0, 0, 640, 535, ga_bufdc, 0, 0, SRCCOPY);
		::DeleteObject(ga_bufMap);
		ga_startTime = ga_lastTime;
	}	
}

void Game::StartGame(void)
{
	ui->ShowFaceMap(ga_begin, ga_exit, ga_help, ga_gameInstruct, ga_instructClose);

	POINT point;                           // 取得鼠标位置
	::GetCursorPos(&point);
	::ScreenToClient(ga_hWnd,&point);

	if (point.x>0 && point.x<160 && point.y>450 && point.y<490)
	{
		ga_begin = true;
		if (!ga_sound1)
		{
			PlaySound(TEXT("../res/sound/pause.wav"), NULL, SND_ASYNC | SND_FILENAME);
			ga_sound1 = true;
		}
		if (KEYDOWN(VK_LBUTTON))
		{
			PlaySound(NULL, NULL, SND_FILENAME|SND_ASYNC);
			PlaySound(TEXT("../res/sound/start.wav"), NULL, SND_ASYNC | SND_FILENAME | SND_NOSTOP);
			ga_gameStart = true;
		}
	}
	else
	{
		ga_begin = false;
		ga_sound1 = false;
	}

	if (point.x>0 && point.x<160 && point.y>490 && point.y<530)
	{
		ga_exit = true;
		if (!ga_sound2)
		{
			PlaySound(TEXT("../res/sound/pause.wav"), NULL, SND_ASYNC | SND_FILENAME);
			ga_sound2 = true;
		}
		if (KEYDOWN(VK_LBUTTON))
		{
			::PostQuitMessage(0);
		}
	}
	else
	{
		ga_exit = false;
		ga_sound2 = false;
	}

	if (point.x>520 && point.x<620 && point.y>470 && point.y<524)
	{
		ga_help = true;
		if (!ga_sound3)
		{
			PlaySound(TEXT("../res/sound/pause.wav"), NULL, SND_ASYNC | SND_FILENAME);
			ga_sound3 = true;
		}
		if (KEYDOWN(VK_LBUTTON))
		{
			PlaySound(NULL, NULL, SND_FILENAME|SND_ASYNC);
			PlaySound(TEXT("../res/sound/start.wav"), NULL, SND_ASYNC | SND_FILENAME | SND_NOSTOP);
			ga_gameInstruct = true;
		}
	}
	else
	{
		ga_help = false;
		ga_sound3 = false;
	}

	if (point.x>305 && point.x<335 && point.y>425 && point.y<445)
	{
		ga_instructClose = true;
		if (KEYDOWN(VK_LBUTTON))
		{
			ga_gameInstruct = false;
		}
	}
	else
	{
		ga_instructClose = false;
	}
}

void Game::PlayGame(void)
{
	for (int n=0; n<ENEMY_SUM_MAX; n++)
	{
		if (ga_lastTime - ga_t2 > 3000 && !ga_enemyEnough)                 // 1.生成敌人
		{					
			if (judge.TackOver(enemy[n]))
			{
				enemy[n]->CreateTack(60+240*n, 30);	
				++ga_enemyIndex;
				if (ga_enemyIndex == 50)
				{
					ga_enemyEnough = true;
				}
				ga_t2 = ga_lastTime;
			}
		}
	}

	judge.MoveTest(hero, enemy, prop, ga_lastTime, ga_t1);  // 2.移动
	// 3.死亡判断
	for (int b=0; b<ENEMY_SUM_MAX; b++)                      // 敌人死亡判断 (当存活却不显示的时候)
	{
		if (enemy[b]!= NULL && enemy[b]->t_live && !enemy[b]->t_show)
		{
			++ge_killNumber;
			hero->h_score += 10;
			hero->h_accScore += 10;
			if (hero->h_accScore >= 1100)
			{
				hero->t_tackMode = 1;
				hero->t_bulletMode = 2;
				if (hero->t_HP >= 7)
				{
					hero->t_HP = 10;
				}
				else
				{
					hero->t_HP += 4;
				}
				hero->h_accScore = 0;
			}
			ui->u_explPoint.x = enemy[b]->t_lockX;
			ui->u_explPoint.y = enemy[b]->t_lockY;
			ui->u_exploding = true;
			ui->u_explodeTurn = 0;
			enemy[b]->t_live = false;
			enemy[b]->t_show = false;
			enemy[b]->t_bullet[0]->b_exit = false;
			enemy[b]->t_bullet[1]->b_exit = false;
			ga_t2 = ga_lastTime;				
		}

		if (ui->u_exploding)
		{
			ui->ShowExplode(ui->u_explPoint.x, ui->u_explPoint.y);
		}
	}

	if (hero!= NULL && hero->t_live && !hero->t_show)  // hero死亡判断
	{
		ui->u_explPoint.x = hero->t_lockX;
		ui->u_explPoint.y = hero->t_lockY;
		ui->u_exploding = true;
		ui->u_explodeTurn = 0;	
		hero->t_life -= 1;
		if (hero->t_life > 0)
		{		
			hero->CreateTack();
		}
		else
		{
			hero->t_live = false;
			hero->t_show = false;
		}
	}

	for (int b=0; b<ENEMY_SUM_MAX; b++)
	{
		if (judge.TackLive(enemy[b]))
		{
			enemy[b]->OperateTack();
			enemy[b]->ShowTack();
			for (int i=0; i<2; i++)                    // 子弹消亡判断
			{
				if (hero->t_bullet[i]->b_exit)
				{
					judge.BulletHitTack(hero->t_bullet[i], enemy[b]);
					// 播放声音
				}
				if (judge.TackLive(hero) && enemy[b]->t_bullet[i]->b_exit)
				{
					judge.BulletHitTack(enemy[b]->t_bullet[i], hero);
				}				
			}
		}
	}

	if (prop->p_live && prop->p_show)
	{
		if (judge.HeroHitProp(hero, prop))   // 道具消失 以及效果
		{
			judge.PropEffect(prop, hero, enemy, map);			
			prop->p_live = false;
			prop->p_show = false;
		}
	}
	if (!prop->p_live && !prop->p_show && !ga_airdroping)
	{
		prop->CreateProp();
	}
	judge.Rebuilt(map);
	judge.CancelStop(enemy);
}

void Game::ShowAirdrop(void)
{
	if (ge_killNumber % 10 == 0 && ge_prekillNumber!=ge_killNumber)
	{
		ga_airdroping = true;
	}
	prop->ShowProp();

	if (ga_airdroping)
	{		
		prop->p_live = true;			
		++ga_airdropSpace;
		ui->ShowAirdrop(ga_airdroping, ge_killNumber, ge_prekillNumber);

		if (ga_airdropSpace == 20)
		{
			prop->p_show = true;					
			ga_airdropSpace = 0;
		}			
	}

	if (prop->p_live && prop->p_show)
	{
		++ga_propLiveSpace;
	}

	if (ga_propLiveSpace>=400 && ga_propLiveSpace<=500)
	{
		prop->p_live = false;
		prop->p_show = false;
		ga_propLiveSpace = 0;
	}
}

⌨️ 快捷键说明

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