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