?? game.cpp
字號:
#include "game.h"
#include "sound.h"
#include <time.h>
CGame *g_pGame = NULL;
ASLBitmap CGame::m_bmBG;
ASLBitmap CGame::m_bmStart;
ASLBitmap CGame::m_bmNumber;
ASLBitmap CGame::m_bmWin;
ASLBitmap CGame::m_bmPlayer;
ASLBitmap CGame::m_bmDraw;
CGame::CGame(void)
: m_nAniSeq(0)
, m_Timer(1000)
, m_nTimeRemain(180)
, m_fTime(0.0f)
{
}
void CGame::Init(void)
{
ASLFileLoader loader;
loader.SetDirApp("Ini");
FACTORY.LoadFixedPrototype(loader.Load("FixedItem.ini"));
CRole::LoadSharedBitmap(loader.Load("RoleShared.ini"));
ROLE[0].Load(loader.Load("Role1.ini"));
ROLE[1].Load(loader.Load("Role2.ini"));
loader.SetDirApp("Pic");
m_bmBG.LoadBMP(loader.Load("BG.bmp"));
m_bmStart.LoadBMP(loader.Load("Start.bmp"));
m_bmStart.SetBlock(3, 1);
m_bmStart.SetColorKey();
m_bmNumber.LoadBMP(loader.Load("Number.bmp"));
m_bmNumber.SetBlock(10, 1);
m_bmNumber.SetColorKey();
m_bmWin.LoadBMP(loader.Load("Win.bmp"));
m_bmWin.SetBlock(3, 1);
m_bmWin.SetColorKey();
m_bmDraw.LoadBMP(loader.Load("Draw.bmp"));
m_bmDraw.SetBlock(3, 1);
m_bmDraw.SetColorKey();
m_bmPlayer.LoadBMP(loader.Load("Player.bmp"));
m_bmPlayer.SetBlock(1, 2);
m_bmPlayer.SetColorKey();
srand((unsigned int)time(NULL));
SOUND.Init();
}
void CGame::LoadMap(ASLFile *pMapFile)
{
MAP.LoadMap(pMapFile);
}
void CGame::Draw(void)
{
// 畫背景
m_bmBG.Draw(SCREEN, 0, 0);
// 畫地圖
MAP.Draw();
// 畫時間
m_bmNumber.Draw(SCREEN, 708, 43, m_nTimeRemain / 60 / 10);
m_bmNumber.Draw(SCREEN, 722, 43, m_nTimeRemain / 60 % 10);
m_bmNumber.Draw(SCREEN, 740, 43, m_nTimeRemain % 60 / 10);
m_bmNumber.Draw(SCREEN, 754, 43, m_nTimeRemain % 60 % 10);
}
void CGame::Start(void)
{
m_Timer.Stop();
m_Timer.Play();
ROLE[0].New();
ROLE[1].New();
ROLE[0].Start();
ROLE[1].Start();
m_fTime = 0;
m_nAniSeq = 0;
// 設置出生地點
ROLE[0].SetPosition(1, 1);
ROLE[1].SetPosition(13, 15);
SOUND.Play(snBG);
SOUND.Play(snStart);
}
void CGame::ProcessInput(void)
{
// 取玩家1輸入
if (INPUT.GetKeyState('R'))
{
ROLE[0].Move(drUp);
}
else if (INPUT.GetKeyState('F'))
{
ROLE[0].Move(drDown);
}
else if (INPUT.GetKeyState('D'))
{
ROLE[0].Move(drLeft);
}
else if (INPUT.GetKeyState('G'))
{
ROLE[0].Move(drRight);
}
if (INPUT.IsKeyJustDown(VK_LSHIFT))
{
ROLE[0].LayPopo();
}
// 取玩家2輸入
if (INPUT.GetKeyState(VK_UP))
{
ROLE[1].Move(drUp);
}
else if (INPUT.GetKeyState(VK_DOWN))
{
ROLE[1].Move(drDown);
}
else if (INPUT.GetKeyState(VK_LEFT))
{
ROLE[1].Move(drLeft);
}
else if (INPUT.GetKeyState(VK_RIGHT))
{
ROLE[1].Move(drRight);
}
if (INPUT.IsKeyJustDown(VK_RSHIFT))
{
ROLE[1].LayPopo();
}
}
void CGame::DrawStart(void)
{
m_bmStart.Draw(SCREEN, 187, 73 - max(0, m_nAniSeq - 40) * 20, 0);
m_bmStart.Draw(SCREEN, 280, 73 - max(0, m_nAniSeq - 43) * 20, 1);
m_bmStart.Draw(SCREEN, 365, 73 - max(0, m_nAniSeq - 46) * 20, 2);
}
void CGame::DrawEnd(void)
{
if (m_EndType == etDraw)
{
m_bmDraw.Draw(SCREEN, 206, 115, 0);
m_bmDraw.Draw(SCREEN, 300, 115, 1);
m_bmDraw.Draw(SCREEN, 385, 115, 2);
}
else
{
m_bmWin.Draw(SCREEN, 206, 115, 0);
m_bmWin.Draw(SCREEN, 300, 115, 1);
m_bmWin.Draw(SCREEN, 385, 115, 2);
if (m_EndType == etFstWin)
{
m_bmPlayer.Draw(SCREEN, 237, 86, 0);
}
else
{
m_bmPlayer.Draw(SCREEN, 237, 86, 1);
}
}
}
void CGame::ClearBomb(void)
{
for (int i = 1; i <= CELL_Y; ++i)
{
for (int j = 1; j <= CELL_X; ++j)
{
if (MAP[i][j].Type == itPopo)
{
SAFE_DELETE(MAP[i][j].pItem);
MAP[i][j].Type = itNone;
}
}
}
}
//-----------------------------------------------------------------------------
CBasicGame::CBasicGame(void)
: m_State(gsStart)
{
}
void CBasicGame::Start(void)
{
CGame::Start();
m_nTimeRemain = 180;
m_State = gsStart;
}
bool CBasicGame::Update(float fDelta)
{
static const float START_DELTA = 0.03f;
static const float END_DELTA = 0.1f;
// 更新地圖
MAP.Update(fDelta);
// 更新角色
for (int i = 0; i < ROLE_NUM; ++i)
{
ROLE[i].Update(fDelta);
}
switch (m_State)
{
case gsRun:
ProcessInput();
// 檢測計時
m_nTimeRemain = 180 - m_Timer.GetTime() / 1000;
if (m_nTimeRemain <= 0)
{
m_nTimeRemain = 0;
if (!ROLE[0].IsDead() && !ROLE[1].IsDead())
{
m_State = gsEnd;
m_EndType = etDraw;
SOUND.StopMusic();
SOUND.Play(snDraw);
ClearBomb();
for (int i = 0; i < ROLE_NUM; ++i)
{
ROLE[i].Normal();
}
}
}
break;
case gsStart:
m_fTime += fDelta;
if (m_fTime > START_DELTA)
{
m_fTime -= START_DELTA;
m_nAniSeq++;
if (m_nAniSeq > 50)
{
m_State = gsRun;
m_fTime = 0;
m_nAniSeq = 0;
}
}
break;
case gsEnd:
m_fTime += fDelta;
if (m_fTime > END_DELTA)
{
m_fTime -= END_DELTA;
m_nAniSeq++;
if (m_nAniSeq > 40)
{
return false;
}
}
break;
}
return true;
}
void CBasicGame::Draw(void)
{
CGame::Draw();
// 畫開始動畫
if (m_State == gsStart)
{
DrawStart();
}
if (m_State == gsEnd)
{
DrawEnd();
}
}
void CBasicGame::RoleOnDie(CRole *pRole)
{
for (int i = 0; i < ROLE_NUM; ++i)
{
if (&ROLE[i] != pRole)
{
ROLE[i].Normal();
}
}
}
void CBasicGame::RoleDead(CRole *pRole)
{
for (int i = 0; i < ROLE_NUM; ++i)
{
if (&ROLE[i] != pRole)
{
ROLE[i].Win();
}
}
ClearBomb();
SOUND.StopMusic();
SOUND.Play(snWin);
m_State = gsEnd;
if (&ROLE[0] == pRole)
{
m_EndType = etSecWin;
}
else
{
m_EndType = etFstWin;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -