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

📄 game.cpp

📁 一个类似坦克大战的小小游戏
💻 CPP
📖 第 1 页 / 共 3 页
字号:

#include "Game.h"
#include <time.h>


CGame::CGame(void)
{
	m_gameState = GS_Title;
	m_hWnd = NULL;
	m_pGraphics = NULL;
	m_pInput = NULL;
	m_pMp3 = NULL;
	m_pResource = NULL;
	m_pSound = NULL;
	m_pMap = NULL;
	m_timeCreateEnemy = 0;
	m_nEnemyCount = 0;
	m_nEnemyKilled = 0;
	m_nLevel = 1;
	m_playerShip[0].m_bActive = false;
	m_playerShip[1].m_bActive = false;
	::srand((unsigned)time(NULL));

	// Get current path, and save it
    GetCurrentDirectory(256, m_sLevelPath);           
}

CGame::~CGame(void)
{
	Release();
}


// Init Game //////////////////////////////////////////////////////////////////

BOOL CGame::Init(HWND hWnd, HINSTANCE hInstance)
{
	m_hWnd = hWnd;

	// Init Graphics
	if (NULL == m_pGraphics)
	{
		m_pGraphics = new CGraphics;
		if (NULL != m_pGraphics)
		{
			if (!m_pGraphics->InitD3D(m_hWnd))
			{
				return FALSE;
			}
		}
		else	// m_pGraphics create failed!
		{
			return FALSE;
		}
	}

	// Init Resources
	if (NULL == m_pResource)
	{
		m_pResource = new CGameResource;
		if (NULL != m_pResource)
		{
			if (!m_pResource->LoadAll(m_pGraphics->Getd3dDevice(), 
										D3DCOLOR_ARGB(255, 0 ,0, 0)))
			{
				return FALSE;
			}
			// Set up back ground data
			m_backGround.m_nTextureIndex = 2;
			m_backGround.m_nWidth = m_pResource->m_textureSea[2].m_nWidth;
			m_backGround.m_nHeight = m_pResource->m_textureSea[2].m_nHeight;
			m_backGround.m_objType = OT_Sea;
			m_backGround.m_pTexture = m_pResource->m_textureSea[2].m_pTexture;
		}
		else	// m_pResource create failed!
		{
			return FALSE;
		}
	}

	// Init DirectInput
	if (NULL == m_pInput)
	{
		m_pInput = new CGameInput;
		if (NULL != m_pInput)
		{
			if (!m_pInput->Create(m_hWnd, hInstance))
			{
				return FALSE;
			}
		}
		else	// m_pInput create failed!
		{
			return FALSE;
		}
	}

	// Init DirectSound
	if (NULL == m_pSound)
	{
		m_pSound = new CGameSound;
		if (NULL != m_pSound)
		{
			if (!m_pSound->Create(m_hWnd))
			{
				return FALSE;
			}
		}
		else	// m_pSound create failed!
		{
			return FALSE;
		}
	}

	// Init DirectShow to play mp3
	if (NULL == m_pMp3)
	{
		m_pMp3 = new CGameMp3;
		if (NULL != m_pMp3)
		{
			if (!m_pMp3->Init(m_hWnd))
			{
				return FALSE;
			}
			// Create default Filter Graph
			m_pMp3->LoadDefaultMusic();
			m_pMp3->Play();
		}
		else
		{
			return FALSE;
		}
	}
	if (NULL == m_pMap)
	{
		m_pMap = new CGameMap;
		if (NULL == m_pMap)
		{
			return FALSE;
		}
	}

	m_gameType = GT_SinglePlayer;
/*	if (!LoadLevel())
	{
		MessageBox(m_hWnd, "没有找到地图文件,请手动选择!", "ERROR!", MB_OK);
	}*/
	return TRUE;
}

// Process Event ////////////////////////////////////////////////////////////

void CGame::ProcessEvent()
{
	if (NULL != m_pMp3)
	{
		// Replay backgroun music
		LONG eventCode;
		LONG param1, param2;
		while (SUCCEEDED(m_pMp3->GetEvnetInterface()->GetEvent(&eventCode, &param1, &param2, 0)))
		{
			m_pMp3->GetEvnetInterface()->FreeEventParams(eventCode, param1, param2);
			if (EC_COMPLETE == eventCode)
			{
				PlayBackgroundMusic();
				break; 
			}
		}
	}
}

// Load Background music ////////////////////////////////////////////////////

BOOL CGame::LoadBackgroundMusic()
{
	if (m_pMp3->LoadMp3File(m_hWnd))
	{
		m_pMp3->Play();
		return TRUE;
	}
	return FALSE;
}

// Load Map /////////////////////////////////////////////////////////////////

BOOL CGame::LoadMap()
{
	if ((NULL != m_pMap) && (NULL != m_pResource))
	{
		if (m_pMap->LoadMap(m_listScenery, *m_pResource))
		{
			return TRUE;
		}
	}
	return FALSE;
}

// Stop background music ////////////////////////////////////////////////////

void CGame::StopBackgroundMusic()
{
	m_pMp3->Stop();
}

// Load Level ///////////////////////////////////////////////////////////////

BOOL CGame::LoadLevel()
{
	char levelName[256];
	memcpy(levelName, m_sLevelPath, 256);
	::wsprintf(levelName, "%s\\maps\\level%d.CMAP", levelName, m_nLevel);
	if (!m_pMap->LoadLevel(levelName, m_listScenery, *m_pResource))
	{
		return FALSE;
	}
	return TRUE;
}

// Reset Map ////////////////////////////////////////////////////////////////

void CGame::ResetMap()
{
	m_listEnemy.clear();
	m_nEnemyCount = 0;
	m_nLevel = 1;
	CreatePlayer1();
	m_playerShip[0].m_dwScore = 0;
	m_playerShip[1].m_bActive = false;
	if (GT_MultiPlayer == m_gameType)
	{
		CreatePlayer2();
		m_playerShip[1].m_dwScore = 0;
	}
}

// Reset Map ///////////////////////////////////////////////////////////////

void CGame::ResetGame()
{
	m_listSort.clear();
	m_listScenery.clear();
	m_listEnemy.clear();
	m_timeCreateEnemy = 0;
	m_nEnemyCount = 0;
	m_nEnemyKilled = 0;
	m_nLevel = 1;
	CreatePlayer1();
	m_playerShip[0].m_dwScore = 0;
	m_playerShip[1].m_bActive = false;
	if (GT_MultiPlayer == m_gameType)
	{
		CreatePlayer2();
		m_playerShip[1].m_dwScore = 0;
	}
	LoadLevel();
}

// Create player ////////////////////////////////////////////////////////////

void CGame::CreatePlayer1()
{
	m_playerShip[0].m_nShipCount = 3;
	PlayerReborn(0);
}

void CGame::CreatePlayer2()
{
	m_playerShip[1].m_nShipCount = 3;
	PlayerReborn(1);
}

void CGame::PlayerReborn(int inIndex)
{
	m_playerShip[inIndex].m_bActive = true;
	m_playerShip[inIndex].m_nBulletCount = 3;
	m_playerShip[inIndex].m_nBulletPower = 1;
	m_playerShip[inIndex].m_nShipCount--;
	m_playerShip[inIndex].m_nDirection = 0;
	m_playerShip[inIndex].m_nSpeed = 2;
	m_playerShip[inIndex].m_nHp = 3;
	m_playerShip[inIndex].m_nSpeedTemp = 2;
	m_playerShip[inIndex].m_pTexture = m_pResource->m_textureWarship[0].m_pTexture;
	m_playerShip[inIndex].m_nWidth = m_pResource->m_textureWarship[0].m_nWidth;
	m_playerShip[inIndex].m_nHeight = m_pResource->m_textureWarship[0].m_nHeight;
	if (0 == inIndex)
	{
		m_playerShip[inIndex].m_nX = 20;
	}
	else
	{
		m_playerShip[inIndex].m_nX = 900;
	}
	m_playerShip[inIndex].m_nY = 560 - m_playerShip[0].m_nHeight - 20;
	m_playerShip[inIndex].m_nLevel = 1;
	m_playerShip[inIndex].m_nShipType = Lugger;
	m_playerShip[inIndex].m_objType = OT_Boat_Player;
	m_playerShip[inIndex].m_nTextureIndex = 0;
	m_pSound->Play(ST_Reborn);
}
// Run //////////////////////////////////////////////////////////////////////

BOOL CGame::Run()
{
	if (!m_playerShip[0].m_bActive && !m_playerShip[1].m_bActive)
	{
		// Game Over
		m_gameState = GS_Over;
	}
	if (m_nEnemyKilled >= ENEMY_KILLED_PASSED)	// Levels up
	{
		m_nLevel++;
		m_nEnemyKilled = 0;
		m_nEnemyCount = 0;
		m_pSound->Play(ST_Win);
		if (!LoadLevel())
		{
			MessageBox(m_hWnd, "恭喜你,你已经战胜了所有所有的敌人!", "Congratulations", MB_OK);
			m_gameState = GS_Over;
		}
		else
		{
			m_listEnemy.clear();
			int nBonusIndex;
			for (nBonusIndex = 0; nBonusIndex != MAX_BONUS; nBonusIndex++)
			{
				m_bonus[nBonusIndex].m_bActive = false;
			}
			m_playerShip[0].m_nX = 20;
			m_playerShip[0].m_nY = 560 - m_playerShip[0].m_nHeight - 20;
			m_playerShip[1].m_nX = 900;
			m_playerShip[1].m_nY = m_playerShip[0].m_nY;
		}
	}
	ProcessInput();	
	ProcessBullet();
	ProcessEnemy();
	return TRUE;
}

// Play background music ////////////////////////////////////////////////////

void CGame::PlayBackgroundMusic()
{
	if (NULL != m_pMp3)
	{
		m_pMp3->Stop();
		if (!m_pMp3->Play())
		{
			MessageBox(NULL, "Background music played failed!", "ERROR!", MB_OK);
		}
	}
}

// Process input ////////////////////////////////////////////////////////////

void CGame::ProcessInput()
{
	m_pInput->GetKeyboardState();
	POINT ptTemp;	// Save the posion of player
	bool bCanMove = true;
	list<CGameObject>::iterator itr;	// The iterator to find out the object hitted player

	// If player1's dead and its ship count > 0, reborn
	if (m_playerShip[0].m_nHp <= 0 && m_playerShip[0].m_bActive)
	{
		CFireworks fireworks;
		fireworks.m_objType = OT_FireworksNormal;
		fireworks.m_pTexture = m_pResource->m_textureFireworks[1].m_pTexture;
		fireworks.m_vectorPos.x = (float)m_playerShip[0].m_nX;
		fireworks.m_vectorPos.y = (float)m_playerShip[0].m_nY;
		fireworks.m_vectorPos.z = 0.0f;
		m_pSound->Play(ST_Explode);
		m_listFireworks.push_back(fireworks);
		if (m_playerShip[0].m_nShipCount > 0)
		{
			PlayerReborn(0);
		}
		else
		{
			m_pSound->Play(ST_Lost);
			m_playerShip[0].m_bActive = false;
		}
	}

	// Process player1's input //////////////////////////////////////////////
	if (m_playerShip[0].m_bActive)
	{
		ptTemp.x = m_playerShip[0].m_nX;
		ptTemp.y = m_playerShip[0].m_nY;

		if (m_playerShip[0].m_bIsInSeaweed && (timeGetTime() - m_playerShip[0].m_timeInSeaweed > 300))
		{
			m_playerShip[0].m_nSpeed = m_playerShip[0].m_nSpeedTemp;
			m_playerShip[0].m_bIsInSeaweed = false;
		}

		if (m_pInput->IsKeyDown(DIK_J))	// Player1 fired
		{
			m_playerShip[0].Fire(m_pResource, m_pSound);
		}

		if (m_pInput->IsKeyDown(DIK_W))		 // Player1 move up
		{
			m_playerShip[0].m_nDirection = 0;
			m_playerShip[0].MoveUp(m_pResource);
			if (m_playerShip[0].m_nY < -30)
			{
				bCanMove = false;
			}
		}
		else if (m_pInput->IsKeyDown(DIK_D)) // Player1 turn right
		{
			m_playerShip[0].m_nDirection = 1;
			m_playerShip[0].MoveRight(m_pResource);
			if (m_playerShip[0].m_nX + m_playerShip[0].m_nWidth > 980)
			{
				bCanMove = false;
			}
		}
		else if (m_pInput->IsKeyDown(DIK_S)) // Player1 move down
		{
			m_playerShip[0].m_nDirection = 2;
			m_playerShip[0].MoveDown(m_pResource);
			if (m_playerShip[0].m_nY + m_playerShip[0].m_nHeight > 560)
			{
				bCanMove = false;
			}
		}
		else if (m_pInput->IsKeyDown(DIK_A)) // Player1 turn left
		{
			m_playerShip[0].m_nDirection = 3;
			m_playerShip[0].MoveLeft(m_pResource);
			if (m_playerShip[0].m_nX < -20)
			{
				bCanMove = false;
			}
		}
	
		// Eat bonus?
		int nBonusIndex;
		for (nBonusIndex = 0; nBonusIndex != MAX_BONUS; nBonusIndex++)
		{
			if (m_bonus[nBonusIndex].m_bActive)
			{
				if (m_bonus[nBonusIndex].HitTest(m_playerShip[0]))
				{
					m_bonus[nBonusIndex].m_bActive = false;
					m_pSound->Play(ST_Bonus);
					switch (m_bonus[nBonusIndex].m_nIndex)
					{
					case 0:
						{
							m_playerShip[0].m_nLevel = 2;
							m_playerShip[0].m_nBulletPower = 5;
							if (m_playerShip[0].m_nHp < 5)
							{
								m_playerShip[0].m_nHp = 5;
							}
							break;
						}
					case 1:
						{
							m_playerShip[0].m_nShipCount++;
							break;
						}
					case 2:
						{
							m_playerShip[0].m_nHp++;
							if (m_playerShip[0].m_nHp >=5)
							{
								m_playerShip[0].m_nLevel = 2;
							}
							break;
						}
					case 3:
						{
							m_playerShip[0].m_nHp += 2;
							if (m_playerShip[0].m_nHp >=5)
							{
								m_playerShip[0].m_nLevel = 2;
							}
							break;
						}
					case 4:
						{
							if (m_playerShip[0].m_nBulletPower < 5)
							{
								m_playerShip[0].m_nBulletPower++;
							}
							else
							{
								m_playerShip[0].m_dwScore += 50;
							}
							break;
						}
					case 5:
						{
							if (m_playerShip[0].m_nBulletPower < 4)
							{
								m_playerShip[0].m_nBulletPower += 2;
							}
							else
							{
								m_playerShip[0].m_nBulletPower = 5;
								if (m_playerShip[0].m_nBulletCount < MAX_BULLET_COUNT)
								{
									m_playerShip[0].m_nBulletCount++;
								}
							}
							break;
						}
					case 6:
						{
							if (m_playerShip[0].m_nSpeed < 5)
							{
								m_playerShip[0].m_nSpeed++;
								m_playerShip[0].m_nSpeedTemp++;
							}
							else

⌨️ 快捷键说明

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