📄 game.cpp
字号:
// Witch type of enemy ship will come into the world?
// LuggerPC's probability : 20%
// Jalor's probability : 30%
// Arrow's probability : 20%
// Tortoise's probability : 10%
// Business's probability : 10%
// Transport's probability : 10%
int nShipIndex = ::rand() % 100;
if ((nShipIndex < 20) && (nShipIndex >= 0))
{
// Create LuggerPc
enemyShip.m_nSpeed = 1;
enemyShip.m_dwScore = 5;
enemyShip.m_nSpeedTemp = 1;
enemyShip.m_nBulletPower = 1;
enemyShip.m_nBulletCount = 2;
enemyShip.m_nHp = 2;
enemyShip.m_nShipType = LuggerPC;
enemyShip.m_pTexture = m_pResource->m_textureWarship[6].m_pTexture;
enemyShip.m_nWidth = m_pResource->m_textureWarship[6].m_nWidth;
enemyShip.m_nHeight = m_pResource->m_textureWarship[6].m_nHeight;
enemyShip.m_nTextureIndex = 4;
}
else if ((nShipIndex < 50) && (nShipIndex >= 20))
{
// Create Jalor
enemyShip.m_nSpeed = 2;
enemyShip.m_dwScore = 7;
enemyShip.m_nSpeedTemp = 2;
enemyShip.m_nBulletPower = 2;
enemyShip.m_nBulletCount = 2;
enemyShip.m_nHp = 3;
enemyShip.m_nShipType = Jalor;
enemyShip.m_pTexture = m_pResource->m_textureWarship[10].m_pTexture;
enemyShip.m_nWidth = m_pResource->m_textureWarship[10].m_nWidth;
enemyShip.m_nHeight = m_pResource->m_textureWarship[10].m_nHeight;
enemyShip.m_nTextureIndex = 8;
}
else if ((nShipIndex < 70) && (nShipIndex >= 50))
{
// Create Arrow
enemyShip.m_nSpeed = 3;
enemyShip.m_dwScore = 7;
enemyShip.m_nSpeedTemp = 3;
enemyShip.m_nBulletPower = 2;
enemyShip.m_nBulletCount = 2;
enemyShip.m_nHp = 3;
enemyShip.m_nShipType = Arrow;
enemyShip.m_pTexture = m_pResource->m_textureWarship[14].m_pTexture;
enemyShip.m_nWidth = m_pResource->m_textureWarship[14].m_nWidth;
enemyShip.m_nHeight = m_pResource->m_textureWarship[14].m_nHeight;
enemyShip.m_nTextureIndex = 12;
}
else if ((nShipIndex < 80) && (nShipIndex >= 70))
{
// Create Tortoise
enemyShip.m_nSpeed = 1;
enemyShip.m_dwScore = 12;
enemyShip.m_nSpeedTemp = 1;
enemyShip.m_nBulletPower = 5;
enemyShip.m_nBulletCount = 3;
enemyShip.m_nHp = 10;
enemyShip.m_nShipType = Tortoise;
enemyShip.m_pTexture = m_pResource->m_textureWarship[18].m_pTexture;
enemyShip.m_nWidth = m_pResource->m_textureWarship[18].m_nWidth;
enemyShip.m_nHeight = m_pResource->m_textureWarship[18].m_nHeight;
enemyShip.m_nTextureIndex = 16;
}
else if ((nShipIndex < 90) && (nShipIndex >= 80))
{
// Create Business
enemyShip.m_nSpeed = 2;
enemyShip.m_dwScore = 7;
enemyShip.m_nSpeedTemp = 2;
enemyShip.m_nBulletPower = 2;
enemyShip.m_nBulletCount = 2;
enemyShip.m_nHp = 4;
enemyShip.m_nShipType = Business;
enemyShip.m_pTexture = m_pResource->m_textureWarship[22].m_pTexture;
enemyShip.m_nWidth = m_pResource->m_textureWarship[22].m_nWidth;
enemyShip.m_nHeight = m_pResource->m_textureWarship[22].m_nHeight;
enemyShip.m_nTextureIndex = 20;
}
else
{
// Create Transport
enemyShip.m_nSpeed = 1;
enemyShip.m_dwScore = 12;
enemyShip.m_nSpeedTemp = 1;
enemyShip.m_nBulletPower = 2;
enemyShip.m_nBulletCount = 2;
enemyShip.m_nHp = 4;
enemyShip.m_nShipType = Transport;
enemyShip.m_pTexture = m_pResource->m_textureWarship[26].m_pTexture;
enemyShip.m_nWidth = m_pResource->m_textureWarship[26].m_nWidth;
enemyShip.m_nHeight = m_pResource->m_textureWarship[26].m_nHeight;
enemyShip.m_nTextureIndex = 24;
}
// Add the ship into the list
m_listEnemy.push_back(enemyShip);
m_nEnemyCount++;
m_timeCreateEnemy = timeGetTime();
}
}
// Process enemy ship //////////////////////////////////////////////
void CGame::ProcessEnemy()
{
CreateEnemy();
list<CComputerShip>::iterator itrEnemy;
for (itrEnemy = m_listEnemy.begin(); itrEnemy != m_listEnemy.end(); itrEnemy++)
{
if ((itrEnemy->m_nHp <= 0) && (itrEnemy->m_nBulletOut == 0))
{
// Enemy's dead, delete from the list
m_nEnemyKilled++;
list<CComputerShip>::iterator itrTemp;
itrTemp = itrEnemy++;
m_listEnemy.erase(itrTemp);
m_nEnemyCount--;
if (itrEnemy == m_listEnemy.end())
{
break;
}
}
else if (itrEnemy->m_nHp > 0) // Process
{
if (timeGetTime() - itrEnemy->m_timeInSeaweed > 300)
{
itrEnemy->m_nSpeed = itrEnemy->m_nSpeedTemp;
itrEnemy->m_timeInSeaweed = false;
}
// Move
switch (itrEnemy->m_nDirection)
{
case 0: // Move up
{
itrEnemy->MoveUp(m_pResource);
break;
}
case 1: // Turn right
{
itrEnemy->MoveRight(m_pResource);
break;
}
case 2: // Move down
{
itrEnemy->MoveDown(m_pResource);
break;
}
case 3: // Turn left
{
itrEnemy->MoveLeft(m_pResource);
break;
}
} // End switch
// Change direction
list<CGameObject>::iterator itrScenery;
bool bChange = false;
for (itrScenery = m_listScenery.begin(); itrScenery != m_listScenery.end(); itrScenery++)
{
if (itrEnemy->HitTest(*itrScenery))
{
if (itrScenery->m_objType == OT_Seaweed)
{
bChange = false;
itrEnemy->m_nSpeed = 1;
itrEnemy->m_bIsInSeaweed = true;
itrEnemy->m_timeInSeaweed = timeGetTime();
}
else
{
bChange = true;
break;
}
}
}
if ((timeGetTime() - itrEnemy->m_timeChange > 1000) || bChange)
{
itrEnemy->ChangeDirection();
itrEnemy->m_timeChange = timeGetTime();
}
if (itrEnemy->m_nX < 0)
{
itrEnemy->m_nDirection = 1;
}
else if (itrEnemy->m_nY < 0)
{
itrEnemy->m_nDirection = 2;
}
else if (itrEnemy->m_nX + itrEnemy->m_nWidth > 960)
{
itrEnemy->m_nDirection = 3;
}
else if (itrEnemy->m_nY + itrEnemy->m_nHeight > 540)
{
itrEnemy->m_nDirection = 0;
}
// Fire
itrEnemy->Fire(m_pResource, m_pSound);
m_listSort.push_back(*itrEnemy);
}
else if (itrEnemy->m_nHp <= 0 && !itrEnemy->m_bIsExplode)
{
// Draw fireworks
CFireworks fireworks;
fireworks.m_objType = OT_FireworksNormal;
fireworks.m_pTexture = m_pResource->m_textureFireworks[1].m_pTexture;
fireworks.m_vectorPos.x = (float)itrEnemy->m_nX;
fireworks.m_vectorPos.y = (float)itrEnemy->m_nY;
fireworks.m_vectorPos.z = 0.0f;
m_listFireworks.push_back(fireworks);
m_pSound->Play(ST_Explode);
itrEnemy->m_bIsExplode = true;
// Create Bonus
if (itrEnemy->m_nShipType == Business)
{
CreateBonus(itrEnemy->m_nX, itrEnemy->m_nY);
}
}
// Add active bullet of the enemy into the sort list.
int nBulletCount;
for (nBulletCount = 0; nBulletCount < itrEnemy->m_nBulletCount; nBulletCount++)
{
if (itrEnemy->m_bullet[nBulletCount].m_bActive)
{
m_listSort.push_back(itrEnemy->m_bullet[nBulletCount]);
}
}
}
}
// Create Bonus ////////////////////////////////////////////////////
void CGame::CreateBonus(int &x, int &y)
{
if (::rand() % 10 < 7) // Probability 70%
{
int i = 0;
for (int i = 0; i < 3; i++)
{
if (!m_bonus[i].m_bActive)
{
m_bonus[i].m_nX = x;
m_bonus[i].m_nY = y;
m_bonus[i].m_bActive = true;
m_bonus[i].m_objType = OT_Bonus;
switch (::rand() % 8)
{
case 0: // Level up
{
m_bonus[i].m_pTexture = m_pResource->m_textureBonus[0].m_pTexture;
m_bonus[i].m_nIndex = 0;
break;
}
case 1: // Player ship++
{
m_bonus[i].m_pTexture = m_pResource->m_textureBonus[1].m_pTexture;
m_bonus[i].m_nIndex = 1;
break;
}
case 2: // HP + 1
{
m_bonus[i].m_pTexture = m_pResource->m_textureBonus[2].m_pTexture;
m_bonus[i].m_nIndex = 2;
break;
}
case 3: // HP + 2
{
m_bonus[i].m_pTexture = m_pResource->m_textureBonus[3].m_pTexture;
m_bonus[i].m_nIndex = 3;
break;
}
case 4: // Power + 1
{
m_bonus[i].m_pTexture = m_pResource->m_textureBonus[4].m_pTexture;
m_bonus[i].m_nIndex = 4;
break;
}
case 5: // Power + 2
{
m_bonus[i].m_pTexture = m_pResource->m_textureBonus[5].m_pTexture;
m_bonus[i].m_nIndex = 5;
break;
}
case 6: // Speed + 1
{
m_bonus[i].m_pTexture = m_pResource->m_textureBonus[6].m_pTexture;
m_bonus[i].m_nIndex = 6;
break;
}
case 7: // Speed + 2
{
m_bonus[i].m_pTexture = m_pResource->m_textureBonus[7].m_pTexture;
m_bonus[i].m_nIndex = 7;
break;
}
} // End switch
break;
}
}
}
}
// Sort ////////////////////////////////////////////////////////////
void CGame::Sort()
{
// Add the scenery into the sort list
list<CGameObject>::iterator itrScenery;
for (itrScenery = m_listScenery.begin(); itrScenery != m_listScenery.end(); itrScenery++)
{
if (itrScenery->m_nHp <= 0)
{
// Add fireworks into the list of fireworks
CFireworks fireworks;
fireworks.m_objType = OT_FireworksNormal;
fireworks.m_pTexture = m_pResource->m_textureFireworks[1].m_pTexture;
fireworks.m_vectorPos.x = (float)itrScenery->m_nX;
fireworks.m_vectorPos.y = (float)itrScenery->m_nY;
fireworks.m_vectorPos.z = 0.0f;
m_listFireworks.push_back(fireworks);
// Play exploded sound
m_pSound->Play(ST_Explode);
// Delete the object from scenery list.
list<CGameObject>::iterator itrTemp;
itrTemp = itrScenery++;
m_listScenery.erase(itrTemp);
if (itrScenery == m_listScenery.end())
{
break;
}
}
else
{
// Add object to the sort list
m_listSort.push_back(*itrScenery);
}
}
int i, j;
for (i = 0; i < 2; i++)
{
if (m_playerShip[i].m_bActive)
{
m_listSort.push_back(m_playerShip[i]);
for (j = 0; j < m_playerShip[i].m_nBulletCount; j++)
{
if (m_playerShip[i].m_bullet[j].m_bActive)
{
m_listSort.push_back(m_playerShip[i].m_bullet[j]);
}
}
}
}
// Sort
m_listSort.sort();
}
// Release Game ////////////////////////////////////////////////////
void CGame::Release()
{
m_listScenery.clear();
m_listEnemy.clear();
m_listSort.clear();
m_listFireworks.clear();
if (NULL != m_pMap)
{
SAFE_DELETE(m_pMap);
}
if (NULL != m_pMp3)
{
SAFE_DELETE(m_pMp3);
}
if (NULL != m_pSound)
{
SAFE_DELETE(m_pSound);
}
if (NULL != m_pInput)
{
SAFE_DELETE(m_pInput);
}
if (NULL != m_pResource)
{
SAFE_DELETE(m_pResource);
}
if (NULL != m_pGraphics)
{
SAFE_DELETE(m_pGraphics);
}
}
// Draw background ////////////////////////////////////////////////////////
void CGame::DrawBackground()
{
// Draw sea
int i, j;
for (i = 0; i < 960; i += 64)
for (j = 0; j < 580; j += 64)
{
m_backGround.Draw(m_pGraphics->Getd3dDevice(), i, j);
}
}
// Draw state /////////////////////////////////////////////////////////////
void CGame::DrawGameState(int inState)
{
if ((NULL != m_pGraphics) && (NULL != m_pResource))
{
if (m_pGraphics->BeginScene())
{
m_pGraphics->DrawObject(m_pResource->m_textureState[inState].m_pTexture,
0, 0, 960, 600, 0xffffffff);
m_pGraphics->EndScene();
}
}
}
// Render /////////////////////////////////////////////////////////////////
void CGame::Render()
{
if ((NULL != m_pGraphics) && (NULL != m_pResource))
{
Sort();
if (m_pGraphics->BeginScene())
{
// Draw back ground first
DrawBackground();
list<CGameObject>::iterator itr;
for (itr = m_listSort.begin(); itr != m_listSort.end(); itr++)
{
itr->Draw(m_pGraphics->Getd3dDevice());
}
int i;
// Draw Bonus
for (i = 0; i < 3; i++)
{
if (m_bonus[i].m_bActive)
{
m_bonus[i].Draw(m_pGraphics->Getd3dDevice());
}
}
// Draw fireworks
list<CFireworks>::iterator itrFireworks;
list<CFireworks>::iterator itrTemp;
for (itrFireworks = m_listFireworks.begin(); itrFireworks != m_listFireworks.end(); itrFireworks++)
{
if (OT_FireworksBullet == itrFireworks->m_objType)
{
itrFireworks->DrawBulletFireworks(m_pGraphics->GetSprite());
}
else
{
itrFireworks->DrawFireworks(m_pGraphics->GetSprite());
}
if (8 == itrFireworks->m_nFrame)
{
// Frames' over, remove it from the list.
itrTemp = itrFireworks++;
m_listFireworks.erase(itrTemp);
if (itrFireworks == m_listFireworks.end())
{
break;
}
}
}
// Draw rect
m_pGraphics->DrawObject(NULL, 0, 560, 960, 30, 0x66000000);
m_pGraphics->EndScene();
}
m_listSort.clear();
// Use GDI to draw score
char strPlayer1[128];
char strPlayer2[128];
::wsprintf(strPlayer1, "Black Pearl Ships:%d HP:%d Speed:%d Power:%d Score:%d",
m_playerShip[0].m_nShipCount, m_playerShip[0].m_nHp, m_playerShip[0].m_nSpeed,
m_playerShip[0].m_nBulletPower, m_playerShip[0].m_dwScore);
::wsprintf(strPlayer2, "Flying Dutchmen Ships:%d HP:%d Speed:%d Power:%d Score:%d",
m_playerShip[1].m_nShipCount, m_playerShip[1].m_nHp, m_playerShip[1].m_nSpeed,
m_playerShip[1].m_nBulletPower, m_playerShip[1].m_dwScore);
HDC hdc = ::GetDC(m_hWnd);
::SetBkMode(hdc , TRANSPARENT);
::SetTextColor(hdc , RGB(255 , 255 ,255));
::TextOut(hdc, 30, 570, strPlayer1, (int)strlen(strPlayer1));
::TextOut(hdc, 510, 570, strPlayer2, (int)strlen(strPlayer2));
::ReleaseDC(m_hWnd, hdc);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -