📄 judge.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 + -