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

📄 game.cpp

📁 泡泡堂单机版(含ASL游戏引擎源码 泡泡堂单机版(含ASL游戏引擎源码
💻 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 + -