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

📄 judge.cpp

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

Judge::Judge(void)
{
	j_builtT1   = 0;
	j_builtT2   = 0;
	j_stopT1    = 0;
	j_stopT2    = 0;
	j_gamePause = false;
	j_gameOver  = false;
	j_skyOpen   = false;
}

Judge::~Judge(void)
{
}

bool Judge::BulletHitTack(Bullet *bullet, Tack *tack)
{
	RECT temp;
	bullet->SetRect(bullet->b_point.x, bullet->b_point.y);
	tack->SetRect(tack->t_lockX, tack->t_lockY);

	if (IntersectRect(&temp, &(bullet->b_rect), &(tack->t_rect)))
	{
		bullet->ShowExplode(bullet->b_point.x-20, bullet->b_point.y-20);
		bullet->b_exploding = true;

		switch (bullet->b_M)    // 不同类型的子弹伤害不同
		{
		case 0:
			{
				tack->t_HP -= 1;
			}
			break;
		case 1:
			{
				tack->t_HP -= 1;
			}
			break;
		case 2:
			{
				tack->t_HP -= 2;
			}
			break;
		case 3:
			{
				tack->t_HP -= 2;
			}
			break;
		default:
			break;
		}
		bullet->b_exit = false;	

		if (tack->t_HP <= 0)
		{
			tack->t_show = false;
		}
		return true;
	}
	return false;
}

bool Judge::HeroHitProp(Tack *hero, Prop *prop)
{
	RECT temp;
	hero->SetRect(hero->t_lockX, hero->t_lockY);

	if (IntersectRect(&temp, &(prop->p_rect), &(hero->t_rect)))
	{
		prop->p_show = false;
		return true;
	}
	return false;
}

void Judge::MoveTest(Tack *hero, Enemy *enemy[], Prop *prop, DWORD &ga_lastTime, DWORD &ga_t1)// 碰撞检测
{
	//hero的碰撞检测 
	for (int i=0; i<ENEMY_SUM_MAX; i++)  
	{
		if (TackLive(hero) && !j_gameOver)
		{
			if (!hero->t_stop && !hero->MoveAble(enemy[i]))
			{
				hero->t_ableMove = false;
				break;
			}
			else
			{
				hero->t_ableMove = true;
			}
		}
	}

	if (!j_gameOver)
	{
		hero->OperateTack();
	}
	hero->ShowTack();

	if ( ga_lastTime - ga_t1 > 150)             // 敌人移动速度控制
	{			
		// 敌人的碰撞检测
		for (int k=0; k<ENEMY_SUM_MAX; k++) 
		{
			if (TackLive(enemy[k]))                                  // k有效
			{
				if (!enemy[k]->t_stop && !enemy[k]->MoveAble(hero))  // 对hero不能移动
				{
					enemy[k]->t_ableMove = false;
					break;
				}
				else
				{
					enemy[k]->t_ableMove = true;
				}
				if (!enemy[k]->t_stop && enemy[k]->t_ableMove)
				{
					for (int g=0; g<ENEMY_SUM_MAX; g++)
					{
						if (k!=g && TackLive(enemy[g]))             // g有效
						{
							if (enemy[k]->TackHitTack(enemy[g], enemy[k]->t_nextX, enemy[k]->t_nextY))   // 对g不能移动
							{
								if (!enemy[k]->TackHitMap(enemy[k]->t_nextX, enemy[k]->t_nextY))
								{
									enemy[k]->t_ableMove = true;
									enemy[g]->t_ableMove = true;
								}
								else
								{
									if (enemy[k]->t_lockY<=470)         // 处理
									{						
									 enemy[k]->t_index = 3;							
									}
									else
									{
										enemy[k]->t_index = 0;
									}
									enemy[k]->t_ableMove = false;
									enemy[g]->t_ableMove = false;
									break;
								}
								enemy[k]->t_ableMove = false;
								enemy[g]->t_ableMove = false;
								break;
							}
						}
					}
				}
			}
		}
		ga_t1 = ga_lastTime;
	}
}

void Judge::PropEffect(Prop *prop, Hero *hero, Enemy *enemy[], Map *map)
{
	switch (prop->getPropMode())
	{
	case prop->p_missile:      // 敌人全部销毁
		{
			for (int i=0; i<ENEMY_SUM_MAX; i++)
			{
				if (TackLive(enemy[i]))
				{
					enemy[i]->t_show = false;
				}				
			}
		}
		break;
	case prop->p_life:         // 增加英雄的命数
		{
			if (hero->t_life < 9)
			{
				hero->t_life += 1;
			}
		}
		break;
	case prop->p_HP:          // 增加hero生命X点
		{
			if (hero->t_HP < 10)
			{
				hero->t_HP += 1;
			}
		}
		break;
	case prop->p_stop:        // 当前地图敌人暂停
		{
			for (int i=0; i<ENEMY_SUM_MAX; i++)
			{
				if (TackLive(enemy[i]))
				{
					enemy[i]->t_stop = true;
				}
			}
			j_stopT1 = ::timeGetTime();
		}
		break;
	case prop->p_pgrade:      // 坦克升级
		{
			if (hero->t_tackMode == 0)
			{
				hero->t_tackMode = 1;
				hero->t_bulletMode = 2;
				hero->t_HP = 10;
			}
		}
		break;
	case prop->p_built:       // 基地加强
		{
			map->m_map[21][11] = 3;
			map->m_map[22][11] = 3;
			map->m_map[23][11] = 3;
			map->m_map[21][12] = 3;
			map->m_map[21][13] = 3;
			map->m_map[21][14] = 3;
			map->m_map[22][14] = 3;
			map->m_map[23][14] = 3;
			j_builtT1 = ::timeGetTime();
		}
		break;
	case prop->p_small:
		{
			hero->h_score += 50;
			hero->h_accScore += 50;
			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;
			}
		}
		break;
	case prop->p_great:
		{
			hero->h_score += 1000;
			hero->h_accScore += 1000;
			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;
			}
		}
		break;
	default:
		break;	
	}
}

void Judge::Rebuilt(Map *map)
{
	j_builtT2 = ::timeGetTime();
	if (j_builtT2 - j_builtT1 > 30000)
	{
		map->m_map[21][11] = (map->m_map[21][11]==3?1:map->m_map[21][11]);
		map->m_map[22][11] = (map->m_map[22][11]==3?1:map->m_map[22][11]);
		map->m_map[23][11] = (map->m_map[23][11]==3?1:map->m_map[23][11]);
		map->m_map[21][12] = (map->m_map[21][12]==3?1:map->m_map[21][12]);
		map->m_map[21][13] = (map->m_map[21][13]==3?1:map->m_map[21][13]);
		map->m_map[21][14] = (map->m_map[21][14]==3?1:map->m_map[21][14]);
		map->m_map[22][14] = (map->m_map[22][14]==3?1:map->m_map[22][14]);
		map->m_map[23][14] = (map->m_map[23][14]==3?1:map->m_map[23][14]);
	}
}

void Judge::CancelStop(Enemy *enemy[])
{
	j_stopT2 = ::timeGetTime();
	if (j_stopT2 - j_stopT1 > 12000)
	{
		for (int i=0; i<ENEMY_SUM_MAX; i++)
		{
			if (TackLive(enemy[i]))
			{
				enemy[i]->t_stop = false;
			}
		}
	}
}

bool Judge::TackLive(Tack *tack)
{
	return (tack!=NULL && tack->t_live && tack->t_show);
}

bool Judge::TackOver(Tack *tack)
{
	return (tack!=NULL && !(tack->t_live) && !(tack->t_show));
}

bool Judge::SkyOpen(void)
{
	if (KEYDOWN('K'))
	{
		j_skyOpen = true;
	}
	if (KEYDOWN('C'))
	{
		j_skyOpen = false;
	}
	return j_skyOpen;
}

bool Judge::GamePause(void)
{
	if (KEYDOWN('P'))
	{
		j_gamePause = true;
	}
	if (KEYDOWN('R'))
	{
		j_gamePause = false;
	}
	return j_gamePause;
}

bool Judge::GameOver(Tack *hero, Enemy *enemy[], Map *map)
{
	if (TackOver(hero))
	{
		j_gameOver = true;
	}
	for (int i=0; i<2; i++)
	{
		if (hero->t_bullet[i]->BulletHitKing(map, hero->t_bullet[i]->b_point.x, hero->t_bullet[i]->b_point.y))
		{
			j_gameOver = true;
			map->m_kingLive = false;
		}
		for (int j=0; j<ENEMY_SUM_MAX; j++)
		{
			if (enemy[j]->t_bullet[i]->BulletHitKing(map, enemy[j]->t_bullet[i]->b_point.x, enemy[j]->t_bullet[i]->b_point.y))
			{
				j_gameOver = true;
				map->m_kingLive = false;
			}
		}
	}
	return j_gameOver;
}

⌨️ 快捷键说明

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