Advertisement
Vlad3955

SBomber.cpp

Sep 18th, 2022
221
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.97 KB | None | 0 0
  1.  
  2. #include <conio.h>
  3. #include <windows.h>
  4.  
  5. #include "MyTools.h"
  6. #include "SBomber.h"
  7. #include "Bomb.h"
  8. #include "Ground.h"
  9. #include "Tank.h"
  10. #include "House.h"
  11.  
  12. using namespace std;
  13. using namespace MyTools;
  14.  
  15. SBomber::SBomber()
  16.     : exitFlag(false),
  17.     startTime(0),
  18.     finishTime(0),
  19.     deltaTime(0),
  20.     passedTime(0),
  21.     fps(0),
  22.     bombsNumber(10),
  23.     score(0)
  24. {
  25.     WriteToLog(string(__FUNCTION__) + " was invoked");
  26.  
  27.     Plane* p = new Plane;
  28.     p->SetDirection(1, 0.1);
  29.     p->SetSpeed(4);
  30.     p->SetPos(5, 10);
  31.     vecDynamicObj.push_back(p);
  32.  
  33.     LevelGUI* pGUI = new LevelGUI;
  34.     pGUI->SetParam(passedTime, fps, bombsNumber, score);
  35.     const uint16_t maxX = GetMaxX();
  36.     const uint16_t maxY = GetMaxY();
  37.     const uint16_t offset = 3;
  38.     const uint16_t width = maxX - 7;
  39.     pGUI->SetPos(offset, offset);
  40.     pGUI->SetWidth(width);
  41.     pGUI->SetHeight(maxY - 4);
  42.     pGUI->SetFinishX(offset + width - 4);
  43.     vecStaticObj.push_back(pGUI);
  44.     Tank* pTank = new Tank;
  45.     pTank->med->AddColeague(pGUI);
  46.  
  47.     Ground* pGr = new Ground;
  48.     const uint16_t groundY = maxY - 5;
  49.     pGr->SetPos(offset + 1, groundY);
  50.     pGr->SetWidth(width - 2);
  51.     vecStaticObj.push_back(pGr);
  52.  
  53.    
  54.     pTank->SetWidth(13);
  55.     pTank->SetPos(30, groundY - 1);
  56.     vecStaticObj.push_back(pTank);
  57.  
  58.     pTank = new Tank;
  59.     pTank->SetWidth(13);
  60.     pTank->SetPos(50, groundY - 1);
  61.     vecStaticObj.push_back(pTank);
  62.  
  63.     House * pHouse = new House;
  64.     pHouse->SetWidth(13);
  65.     pHouse->SetPos(80, groundY - 1);
  66.     vecStaticObj.push_back(pHouse);
  67.  
  68.     /*
  69.     Bomb* pBomb = new Bomb;
  70.     pBomb->SetDirection(0.3, 1);
  71.     pBomb->SetSpeed(2);
  72.     pBomb->SetPos(51, 5);
  73.     pBomb->SetSize(SMALL_CRATER_SIZE);
  74.     vecDynamicObj.push_back(pBomb);
  75.     */
  76. }
  77.  
  78. SBomber::~SBomber()
  79. {
  80.     for (size_t i = 0; i < vecDynamicObj.size(); i++)
  81.     {
  82.         if (vecDynamicObj[i] != nullptr)
  83.         {
  84.             delete vecDynamicObj[i];
  85.         }
  86.     }
  87.  
  88.     for (size_t i = 0; i < vecStaticObj.size(); i++)
  89.     {
  90.         if (vecStaticObj[i] != nullptr)
  91.         {
  92.             delete vecStaticObj[i];
  93.         }
  94.     }
  95. }
  96.  
  97. void SBomber::MoveObjects()
  98. {
  99.     WriteToLog(string(__FUNCTION__) + " was invoked");
  100.  
  101.     for (size_t i = 0; i < vecDynamicObj.size(); i++)
  102.     {
  103.         if (vecDynamicObj[i] != nullptr)
  104.         {
  105.             vecDynamicObj[i]->Move(deltaTime);
  106.         }
  107.     }
  108. };
  109.  
  110. void SBomber::CheckObjects()
  111. {
  112.     WriteToLog(string(__FUNCTION__) + " was invoked");
  113.  
  114.     CheckPlaneAndLevelGUI();
  115.     CheckBombsAndGround();
  116. };
  117.  
  118. void SBomber::CheckPlaneAndLevelGUI()
  119. {
  120.     if (FindPlane()->GetX() > FindLevelGUI()->GetFinishX())
  121.     {
  122.         exitFlag = true;
  123.     }
  124. }
  125.  
  126. void SBomber::CheckBombsAndGround()
  127. {
  128.     vector<Bomb*> vecBombs = FindAllBombs();
  129.     Ground* pGround = FindGround();
  130.     const double y = pGround->GetY();
  131.     for (size_t i = 0; i < vecBombs.size(); i++)
  132.     {
  133.         if (vecBombs[i]->GetY() >= y) // Пересечение бомбы с землей
  134.         {
  135.             pGround->AddCrater(vecBombs[i]->GetX());
  136.             CheckDestoyableObjects(vecBombs[i]);
  137.             DeleteDynamicObj(vecBombs[i]);
  138.         }
  139.     }
  140.  
  141. }
  142.  
  143. void SBomber::CheckDestoyableObjects(Bomb * pBomb)
  144. {
  145.     vector<DestroyableGroundObject*> vecDestoyableObjects = FindDestoyableGroundObjects();
  146.     const double size = pBomb->GetWidth();
  147.     const double size_2 = size / 2;
  148.     for (size_t i = 0; i < vecDestoyableObjects.size(); i++)
  149.     {
  150.         const double x1 = pBomb->GetX() - size_2;
  151.         const double x2 = x1 + size;
  152.         if (vecDestoyableObjects[i]->isInside(x1, x2))
  153.         {
  154.             score += vecDestoyableObjects[i]->GetScore();
  155.             DeleteStaticObj(vecDestoyableObjects[i]);
  156.         }
  157.     }
  158. }
  159.  
  160. void SBomber::DeleteDynamicObj(DynamicObject* pObj)
  161. {
  162.     auto it = vecDynamicObj.begin();
  163.     for (; it != vecDynamicObj.end(); it++)
  164.     {
  165.         if (*it == pObj)
  166.         {
  167.             vecDynamicObj.erase(it);
  168.             break;
  169.         }
  170.     }
  171. }
  172.  
  173. void SBomber::DeleteStaticObj(GameObject* pObj)
  174. {
  175.     auto it = vecStaticObj.begin();
  176.     for (; it != vecStaticObj.end(); it++)
  177.     {
  178.         if (*it == pObj)
  179.         {
  180.             vecStaticObj.erase(it);
  181.             break;
  182.         }
  183.     }
  184. }
  185.  
  186. vector<DestroyableGroundObject*> SBomber::FindDestoyableGroundObjects() const
  187. {
  188.     vector<DestroyableGroundObject*> vec;
  189.     Tank* pTank;
  190.     House* pHouse;
  191.     for (size_t i = 0; i < vecStaticObj.size(); i++)
  192.     {
  193.         pTank = dynamic_cast<Tank*>(vecStaticObj[i]);
  194.         if (pTank != nullptr)
  195.         {
  196.             vec.push_back(pTank);
  197.             continue;
  198.         }
  199.  
  200.         pHouse = dynamic_cast<House*>(vecStaticObj[i]);
  201.         if (pHouse != nullptr)
  202.         {
  203.             vec.push_back(pHouse);
  204.             continue;
  205.         }
  206.     }
  207.  
  208.     return vec;
  209. }
  210.  
  211. Ground* SBomber::FindGround() const
  212. {
  213.     Ground* pGround;
  214.  
  215.     for (size_t i = 0; i < vecStaticObj.size(); i++)
  216.     {
  217.         pGround = dynamic_cast<Ground *>(vecStaticObj[i]);
  218.         if (pGround != nullptr)
  219.         {
  220.             return pGround;
  221.         }
  222.     }
  223.  
  224.     return nullptr;
  225. }
  226.  
  227. vector<Bomb*> SBomber::FindAllBombs() const
  228. {
  229.     vector<Bomb*> vecBombs;
  230.  
  231.     for (size_t i = 0; i < vecDynamicObj.size(); i++)
  232.     {
  233.         Bomb* pBomb = dynamic_cast<Bomb*>(vecDynamicObj[i]);
  234.         if (pBomb != nullptr)
  235.         {
  236.             vecBombs.push_back(pBomb);
  237.         }
  238.     }
  239.  
  240.     return vecBombs;
  241. }
  242.  
  243. Plane* SBomber::FindPlane() const
  244. {
  245.     for (size_t i = 0; i < vecDynamicObj.size(); i++)
  246.     {
  247.         Plane* p = dynamic_cast<Plane*>(vecDynamicObj[i]);
  248.         if (p != nullptr)
  249.         {
  250.             return p;
  251.         }
  252.     }
  253.  
  254.     return nullptr;
  255. }
  256.  
  257. LevelGUI* SBomber::FindLevelGUI() const
  258. {
  259.     for (size_t i = 0; i < vecStaticObj.size(); i++)
  260.     {
  261.         LevelGUI* p = dynamic_cast<LevelGUI*>(vecStaticObj[i]);
  262.         if (p != nullptr)
  263.         {
  264.             return p;
  265.         }
  266.     }
  267.  
  268.     return nullptr;
  269. }
  270.  
  271. void SBomber::ProcessKBHit()
  272. {
  273.     int c = _getch();
  274.  
  275.     if (c == 224)
  276.     {
  277.         c = _getch();
  278.     }
  279.  
  280.     WriteToLog(string(__FUNCTION__) + " was invoked. key = ", c);
  281.  
  282.     switch (c) {
  283.  
  284.     case 27: // esc
  285.         exitFlag = true;
  286.         break;
  287.  
  288.     case 72: // up
  289.         FindPlane()->ChangePlaneY(-0.25);
  290.         break;
  291.  
  292.     case 80: // down
  293.         FindPlane()->ChangePlaneY(0.25);
  294.         break;
  295.  
  296.     case 'b':
  297.         DropBomb();
  298.         break;
  299.  
  300.     case 'B':
  301.         DropBomb();
  302.         break;
  303.  
  304.     default:
  305.         break;
  306.     }
  307. }
  308.  
  309. void SBomber::DrawFrame()
  310. {
  311.     WriteToLog(string(__FUNCTION__) + " was invoked");
  312.  
  313.     for (size_t i = 0; i < vecDynamicObj.size(); i++)
  314.     {
  315.         if (vecDynamicObj[i] != nullptr)
  316.         {
  317.             vecDynamicObj[i]->Draw();
  318.         }
  319.     }
  320.  
  321.     for (size_t i = 0; i < vecStaticObj.size(); i++)
  322.     {
  323.         if (vecStaticObj[i] != nullptr)
  324.         {
  325.             vecStaticObj[i]->Draw();
  326.         }
  327.     }
  328.  
  329.     GotoXY(0, 0);
  330.     fps++;
  331.  
  332.     FindLevelGUI()->SetParam(passedTime, fps, bombsNumber, score);
  333. }
  334.  
  335. void SBomber::TimeStart()
  336. {
  337.     WriteToLog(string(__FUNCTION__) + " was invoked");
  338.     startTime = GetTickCount64();
  339. }
  340.  
  341. void SBomber::TimeFinish()
  342. {
  343.     finishTime = GetTickCount64();
  344.     deltaTime = uint16_t(finishTime - startTime);
  345.     passedTime += deltaTime;
  346.  
  347.     WriteToLog(string(__FUNCTION__) + " deltaTime = ", (int)deltaTime);
  348. }
  349.  
  350. void SBomber::DropBomb()
  351. {
  352.     if (bombsNumber > 0)
  353.     {
  354.         WriteToLog(string(__FUNCTION__) + " was invoked");
  355.  
  356.         Plane* pPlane = FindPlane();
  357.         double x = pPlane->GetX() + 4;
  358.         double y = pPlane->GetY() + 2;
  359.  
  360.         Bomb* pBomb = new Bomb;
  361.         pBomb->SetDirection(0.3, 1);
  362.         pBomb->SetSpeed(2);
  363.         pBomb->SetPos(x, y);
  364.         pBomb->SetWidth(SMALL_CRATER_SIZE);
  365.  
  366.         vecDynamicObj.push_back(pBomb);
  367.         bombsNumber--;
  368.         score -= Bomb::BombCost;
  369.     }
  370. }
  371.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement