📄 game.cpp
字号:
#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, ¶m1, ¶m2, 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 + -