lesson 2 withot destroy

This commit is contained in:
Alexander Zhirov 2021-12-25 08:46:23 +03:00
parent 42495521c3
commit e37ff585f7
7 changed files with 1622 additions and 343 deletions

View File

@ -6,7 +6,7 @@ class Bomb : public DynamicObject
{ {
public: public:
static const uint16_t BombCost = 10; // ñòîèìîñòü áîìáû â î÷êàõ static const uint16_t BombCost = 10;
void Draw() const override; void Draw() const override;
@ -14,3 +14,17 @@ private:
}; };
class BombDecorator: public DynamicObject
{
public:
BombDecorator(DynamicObject *bomb) : m_bomb(bomb)
{
}
void Move(uint16_t time) override;
void Draw() const override;
void SetPos(double nx, double ny) override;
uint16_t GetWidth() const override;
private:
DynamicObject *m_bomb;
};

View File

@ -2,25 +2,41 @@
#include <cstdint> #include <cstdint>
class GameObject { class GameObject
{
public: public:
GameObject() : x(0.0), y(0.0), width(0) {} GameObject() : x(0.0), y(0.0), width(0)
virtual ~GameObject() = default; {
}
virtual ~GameObject() = default;
virtual void Draw() const = 0; virtual void Draw() const = 0;
inline void SetPos(double nx, double ny) { virtual inline void SetPos(double nx, double ny)
x = nx; {
y = ny; x = nx;
} y = ny;
}
inline double GetY() const { return y; } virtual inline double GetY() const
inline double GetX() const { return x; } {
return y;
}
virtual inline double GetX() const
{
return x;
}
inline void SetWidth(uint16_t widthN) { width = widthN; } virtual inline void SetWidth(uint16_t widthN)
inline uint16_t GetWidth() const { return width; } {
width = widthN;
}
virtual inline uint16_t GetWidth() const
{
return width;
}
protected: protected:
double x, y; double x, y;
uint16_t width; uint16_t width;
}; };

View File

@ -11,11 +11,13 @@
class SBomber class SBomber
{ {
public: public:
SBomber(); SBomber();
~SBomber(); ~SBomber();
inline bool GetExitFlag() const { return exitFlag; } inline bool GetExitFlag() const
{
return exitFlag;
}
void ProcessKBHit(); void ProcessKBHit();
void TimeStart(); void TimeStart();
@ -25,22 +27,23 @@ public:
void MoveObjects(); void MoveObjects();
void CheckObjects(); void CheckObjects();
private: void run();
private:
void CheckPlaneAndLevelGUI(); void CheckPlaneAndLevelGUI();
void CheckBombsAndGround(); void CheckBombsAndGround();
void CheckDestoyableObjects(Bomb* pBomb); void CheckDestoyableObjects(Bomb *pBomb);
void DeleteDynamicObj(DynamicObject * pBomb); // void DeleteDynamicObj(DynamicObject *pBomb);
void DeleteStaticObj(GameObject* pObj); // void DeleteStaticObj(GameObject *pObj);
Ground * FindGround() const; Ground* FindGround() const;
Plane * FindPlane() const; Plane* FindPlane() const;
LevelGUI * FindLevelGUI() const; LevelGUI* FindLevelGUI() const;
std::vector<DestroyableGroundObject*> FindDestoyableGroundObjects() const; std::vector<DestroyableGroundObject*> FindDestoyableGroundObjects() const;
std::vector<Bomb*> FindAllBombs() const; std::vector<Bomb*> FindAllBombs() const;
void DropBomb(); // void DropBomb();
std::vector<DynamicObject*> vecDynamicObj; std::vector<DynamicObject*> vecDynamicObj;
std::vector<GameObject*> vecStaticObj; std::vector<GameObject*> vecStaticObj;

View File

@ -2,58 +2,12 @@
#include "MyTools.h" #include "MyTools.h"
#include "ScreenSingleton.h" #include "ScreenSingleton.h"
#include <iostream>
#include <fstream>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
#include <sys/ioctl.h>
int _kbhit()
{
static const int STDIN = 0;
static bool initialized = false;
if (!initialized)
{
// Use termios to turn off line buffering
termios term;
tcgetattr(STDIN, &term);
term.c_lflag &= ~ICANON;
tcsetattr(STDIN, TCSANOW, &term);
setbuf(stdin, NULL);
initialized = true;
}
int bytesWaiting;
ioctl(STDIN, FIONREAD, &bytesWaiting);
return bytesWaiting;
}
int main(void) int main(void)
{ {
MyTools::LoggerSingleton::getInstance().OpenLogFile("log.txt"); MyTools::LoggerSingleton::getInstance().OpenLogFile("log.txt");
SBomber game; SBomber game;
game.run();
do
{
game.TimeStart();
if (_kbhit())
{
game.ProcessKBHit();
}
ScreenSingleton::getInstance().ClrScr();
game.DrawFrame();
game.MoveObjects();
game.CheckObjects();
game.TimeFinish();
} while (!game.GetExitFlag());
MyTools::LoggerSingleton::getInstance().CloseLogFile(); MyTools::LoggerSingleton::getInstance().CloseLogFile();

View File

@ -7,3 +7,26 @@ void Bomb::Draw() const {
ScreenSingleton::getInstance().GotoXY(x, y); ScreenSingleton::getInstance().GotoXY(x, y);
std::cout << "*"; std::cout << "*";
} }
void BombDecorator::Move(uint16_t time)
{
m_bomb->Move(time * 1.6);
}
void BombDecorator::Draw() const
{
m_bomb->Draw();
// Некоторое изменение внешнего вида бомбы
ScreenSingleton::getInstance().GotoXY(m_bomb->GetX(), m_bomb->GetY() - 1);
std::cout << "|";
}
void BombDecorator::SetPos(double nx, double ny)
{
m_bomb->SetPos(nx, ny);
}
uint16_t BombDecorator::GetWidth() const
{
return m_bomb->GetWidth();
}

View File

@ -1,4 +1,3 @@
#include "MyTools.h" #include "MyTools.h"
#include "SBomber.h" #include "SBomber.h"
#include "Bomb.h" #include "Bomb.h"
@ -10,302 +9,542 @@
#include <chrono> #include <chrono>
#include <thread> #include <thread>
SBomber::SBomber() #include <iostream>
: exitFlag(false), startTime(0), finishTime(0), deltaTime(0), passedTime(0), #include <fstream>
fps(0), bombsNumber(10), score(0) { #include <unistd.h>
MyTools::LoggerSingleton::getInstance().WriteToLog(std::string(__func__) + " was invoked"); #include <fcntl.h>
#include <termios.h>
#include <sys/ioctl.h>
Plane* p = new Plane; int _kbhit()
p->SetDirection(1, 0.1); {
p->SetSpeed(4); static const int STDIN = 0;
p->SetPos(5, 10); static bool initialized = false;
vecDynamicObj.push_back(p);
LevelGUI* pGUI = new LevelGUI; if (!initialized)
pGUI->SetParam(passedTime, fps, bombsNumber, score); {
const uint16_t maxX = ScreenSingleton::getInstance().GetMaxX(); // Use termios to turn off line buffering
const uint16_t maxY = ScreenSingleton::getInstance().GetMaxY(); termios term;
const uint16_t offset = 3; tcgetattr(STDIN, &term);
const uint16_t width = maxX - 7; term.c_lflag &= ~ICANON;
pGUI->SetPos(offset, offset); tcsetattr(STDIN, TCSANOW, &term);
pGUI->SetWidth(width); setbuf(stdin, NULL);
pGUI->SetHeight(maxY - 4); initialized = true;
pGUI->SetFinishX(offset + width - 4); }
vecStaticObj.push_back(pGUI);
Ground* pGr = new Ground; int bytesWaiting;
const uint16_t groundY = maxY - 5; ioctl(STDIN, FIONREAD, &bytesWaiting);
pGr->SetPos(offset + 1, groundY); return bytesWaiting;
pGr->SetWidth(width - 2);
vecStaticObj.push_back(pGr);
Tank* pTank = new Tank;
pTank->SetWidth(13);
pTank->SetPos(30, groundY - 1);
vecStaticObj.push_back(pTank);
pTank = new Tank;
pTank->SetWidth(13);
pTank->SetPos(50, groundY - 1);
vecStaticObj.push_back(pTank);
House* pHouse = new House;
pHouse->SetWidth(13);
pHouse->SetPos(80, groundY - 1);
vecStaticObj.push_back(pHouse);
/*
Bomb* pBomb = new Bomb;
pBomb->SetDirection(0.3, 1);
pBomb->SetSpeed(2);
pBomb->SetPos(51, 5);
pBomb->SetSize(SMALL_CRATER_SIZE);
vecDynamicObj.push_back(pBomb);
*/
} }
SBomber::~SBomber() { class IFactory
for (size_t i = 0; i < vecDynamicObj.size(); i++) { {
if (vecDynamicObj[i] != nullptr) { public:
delete vecDynamicObj[i]; virtual ~IFactory() {}
}
}
for (size_t i = 0; i < vecStaticObj.size(); i++) { DynamicObject* createPlane() const
if (vecStaticObj[i] != nullptr) { {
delete vecStaticObj[i]; Plane *p = createPlaneInstance();
p->SetDirection(1, 0.1);
p->SetSpeed(4);
p->SetPos(5, 10);
return p;
} }
}
}
void SBomber::MoveObjects() { DynamicObject* createBomb(const double x, const double y) const
MyTools::LoggerSingleton::getInstance().WriteToLog(std::string(__func__) + " was invoked"); {
Bomb *pBomb = createBombInstance();
for (size_t i = 0; i < vecDynamicObj.size(); i++) { pBomb->SetDirection(0.3, 1);
if (vecDynamicObj[i] != nullptr) { pBomb->SetSpeed(2);
vecDynamicObj[i]->Move(deltaTime); pBomb->SetPos(x, y);
pBomb->SetWidth(SMALL_CRATER_SIZE);
return pBomb;
} }
}
GameObject* createUI(const uint64_t passedTime, const uint64_t fps, const uint16_t bombsNumber, const int16_t score) const
{
LevelGUI *pGUI = createUIInstance();
pGUI->SetParam(passedTime, fps, bombsNumber, score);
const uint16_t maxX = ScreenSingleton::getInstance().GetMaxX();
const uint16_t maxY = ScreenSingleton::getInstance().GetMaxY();
const uint16_t offset = 3;
const uint16_t width = maxX - 7;
pGUI->SetPos(offset, offset);
pGUI->SetWidth(width);
pGUI->SetHeight(maxY - 4);
pGUI->SetFinishX(offset + width - 4);
return pGUI;
}
virtual GameObject* createHouse(double posX) const
{
const uint16_t maxY = ScreenSingleton::getInstance().GetMaxY();
const uint16_t groundY = maxY - 5;
House *pHouse = createHouseInstance();
pHouse->SetWidth(13);
pHouse->SetPos(posX, groundY - 1);
return pHouse;
}
virtual GameObject* createGround() const
{
const uint16_t maxX = ScreenSingleton::getInstance().GetMaxX();
const uint16_t maxY = ScreenSingleton::getInstance().GetMaxY();
const uint16_t offset = 3;
const uint16_t width = maxX - 7;
Ground *pGr = createGroundInstance();
const uint16_t groundY = maxY - 5;
pGr->SetPos(offset + 1, groundY);
pGr->SetWidth(width - 2);
return pGr;
}
virtual GameObject* createTank(double posX) const
{
const uint16_t maxY = ScreenSingleton::getInstance().GetMaxY();
const uint16_t groundY = maxY - 5;
Tank *pTank = createTankInstance();
pTank->SetWidth(13);
pTank->SetPos(posX, groundY - 1);
return pTank;
}
private:
virtual Plane* createPlaneInstance() const = 0;
virtual Bomb* createBombInstance() const = 0;
virtual LevelGUI* createUIInstance() const = 0;
virtual Ground* createGroundInstance() const = 0;
virtual Tank* createTankInstance() const = 0;
virtual House* createHouseInstance() const = 0;
}; };
void SBomber::CheckObjects() { class RegularFactory : public IFactory
MyTools::LoggerSingleton::getInstance().WriteToLog(std::string(__func__) + " was invoked"); {
Plane* createPlaneInstance() const override
{
return new Plane;
}
CheckPlaneAndLevelGUI(); Bomb* createBombInstance() const override
CheckBombsAndGround(); {
return new Bomb;
}
LevelGUI* createUIInstance() const override
{
return new LevelGUI;
}
Ground* createGroundInstance() const override
{
return new Ground;
}
Tank* createTankInstance() const override
{
return new Tank;
}
House* createHouseInstance() const override
{
return new House;
}
}; };
void SBomber::CheckPlaneAndLevelGUI() { class Command
if (FindPlane()->GetX() > FindLevelGUI()->GetFinishX()) { {
exitFlag = true; public:
} virtual ~Command() {}
} virtual void Execute() = 0;
};
void SBomber::CheckBombsAndGround() { template <class Object>
std::vector<Bomb*> vecBombs = FindAllBombs(); class DeleteCommand : public Command
Ground* pGround = FindGround(); {
const double y = pGround->GetY(); public:
for (size_t i = 0; i < vecBombs.size(); i++) { DeleteCommand(std::vector<Object*>& vecObj) : m_vecObj(vecObj), m_pObj(nullptr) {}
if (vecBombs[i]->GetY() >= y) { void setObj(Object *pObj)
pGround->AddCrater(vecBombs[i]->GetX()); {
CheckDestoyableObjects(vecBombs[i]); m_pObj = pObj;
DeleteDynamicObj(vecBombs[i]);
} }
} void Execute()
} {
if (!m_pObj)
{
return;
}
void SBomber::CheckDestoyableObjects(Bomb* pBomb) { auto it = m_vecObj.begin();
std::vector<DestroyableGroundObject*> vecDestoyableObjects = for (; it != m_vecObj.end(); it++)
FindDestoyableGroundObjects(); {
const double size = pBomb->GetWidth(); if (*it == m_pObj)
const double size_2 = size / 2; {
for (size_t i = 0; i < vecDestoyableObjects.size(); i++) { m_vecObj.erase(it);
const double x1 = pBomb->GetX() - size_2; break;
const double x2 = x1 + size; }
if (vecDestoyableObjects[i]->isInside(x1, x2)) { }
score += vecDestoyableObjects[i]->GetScore();
DeleteStaticObj(vecDestoyableObjects[i]);
} }
} private:
} std::vector<Object*>& m_vecObj;
Object *m_pObj;
};
void SBomber::DeleteDynamicObj(DynamicObject* pObj) { class DropCommand : public Command
auto it = vecDynamicObj.begin(); {
for (; it != vecDynamicObj.end(); it++) { public:
if (*it == pObj) { DropCommand(std::vector<DynamicObject*>& vecDynamicObj) : m_vecDynamicObj(vecDynamicObj), m_pPlane(nullptr), m_bombsNumber(nullptr), m_score(nullptr) {}
vecDynamicObj.erase(it); void setParams(Plane *pPlane, uint16_t *bombsNumber, int16_t *score)
break; {
m_pPlane = pPlane;
m_bombsNumber = bombsNumber;
m_score = score;
} }
} void Execute()
} {
if (*m_bombsNumber > 0)
{
MyTools::LoggerSingleton::getInstance().WriteToLog(std::string(__func__) + " was invoked");
void SBomber::DeleteStaticObj(GameObject* pObj) { double x = m_pPlane->GetX() + 4;
auto it = vecStaticObj.begin(); double y = m_pPlane->GetY() + 2;
for (; it != vecStaticObj.end(); it++) {
if (*it == pObj) { auto pFactory = new RegularFactory;
vecStaticObj.erase(it); m_vecDynamicObj.push_back(pFactory->createBomb(x, y));
break; delete pFactory;
(*m_bombsNumber)--;
*m_score -= Bomb::BombCost;
}
} }
} private:
} std::vector<DynamicObject*>& m_vecDynamicObj;
Plane *m_pPlane;
uint16_t *m_bombsNumber;
int16_t *m_score;
};
std::vector<DestroyableGroundObject*> SBomber::FindDestoyableGroundObjects() const { class DropBigCommand : public Command
std::vector<DestroyableGroundObject*> vec; {
Tank* pTank; public:
House* pHouse; DropBigCommand(std::vector<DynamicObject*>& vecDynamicObj) : m_vecDynamicObj(vecDynamicObj), m_pPlane(nullptr), m_bombsNumber(nullptr), m_score(nullptr) {}
for (size_t i = 0; i < vecStaticObj.size(); i++) { void setParams(Plane *pPlane, uint16_t *bombsNumber, int16_t *score)
pTank = dynamic_cast<Tank*>(vecStaticObj[i]); {
if (pTank != nullptr) { m_pPlane = pPlane;
vec.push_back(pTank); m_bombsNumber = bombsNumber;
continue; m_score = score;
} }
void Execute()
{
if (*m_bombsNumber > 0)
{
MyTools::LoggerSingleton::getInstance().WriteToLog(std::string(__func__) + " was invoked");
pHouse = dynamic_cast<House*>(vecStaticObj[i]); double x = m_pPlane->GetX() + 4;
if (pHouse != nullptr) { double y = m_pPlane->GetY() + 2;
vec.push_back(pHouse);
continue; auto pFactory = new RegularFactory;
m_vecDynamicObj.push_back(new BombDecorator(pFactory->createBomb(x, y)));
delete pFactory;
(*m_bombsNumber)--;
*m_score -= Bomb::BombCost;
}
} }
} private:
std::vector<DynamicObject*>& m_vecDynamicObj;
Plane *m_pPlane;
uint16_t *m_bombsNumber;
int16_t *m_score;
};
return vec; SBomber::SBomber() : exitFlag(false), startTime(0), finishTime(0), deltaTime(0), passedTime(0), fps(0), bombsNumber(10), score(0)
} {
Ground* SBomber::FindGround() const {
Ground* pGround;
for (size_t i = 0; i < vecStaticObj.size(); i++) {
pGround = dynamic_cast<Ground*>(vecStaticObj[i]);
if (pGround != nullptr) {
return pGround;
}
}
return nullptr;
}
std::vector<Bomb*> SBomber::FindAllBombs() const {
std::vector<Bomb*> vecBombs;
for (size_t i = 0; i < vecDynamicObj.size(); i++) {
Bomb* pBomb = dynamic_cast<Bomb*>(vecDynamicObj[i]);
if (pBomb != nullptr) {
vecBombs.push_back(pBomb);
}
}
return vecBombs;
}
Plane* SBomber::FindPlane() const {
for (size_t i = 0; i < vecDynamicObj.size(); i++) {
Plane* p = dynamic_cast<Plane*>(vecDynamicObj[i]);
if (p != nullptr) {
return p;
}
}
return nullptr;
}
LevelGUI* SBomber::FindLevelGUI() const {
for (size_t i = 0; i < vecStaticObj.size(); i++) {
LevelGUI* p = dynamic_cast<LevelGUI*>(vecStaticObj[i]);
if (p != nullptr) {
return p;
}
}
return nullptr;
}
void SBomber::ProcessKBHit() {
int c = getchar();
if (c == 224) {
c = getchar();
}
MyTools::LoggerSingleton::getInstance().WriteToLog(std::string(__func__) + " was invoked. key = ", c);
switch (c) {
case 27: // esc
exitFlag = true;
break;
case 72: // up
FindPlane()->ChangePlaneY(-0.25);
break;
case 80: // down
FindPlane()->ChangePlaneY(0.25);
break;
case 'b':
DropBomb();
break;
case 'B':
DropBomb();
break;
default:
break;
}
}
void SBomber::DrawFrame() {
MyTools::LoggerSingleton::getInstance().WriteToLog(std::string(__func__) + " was invoked");
for (size_t i = 0; i < vecDynamicObj.size(); i++) {
if (vecDynamicObj[i] != nullptr) {
vecDynamicObj[i]->Draw();
}
}
for (size_t i = 0; i < vecStaticObj.size(); i++) {
if (vecStaticObj[i] != nullptr) {
vecStaticObj[i]->Draw();
}
}
ScreenSingleton::getInstance().GotoXY(0, 0);
fps++;
FindLevelGUI()->SetParam(passedTime, fps, bombsNumber, score);
}
void SBomber::TimeStart() {
MyTools::LoggerSingleton::getInstance().WriteToLog(std::string(__func__) + " was invoked");
startTime = std::chrono::duration_cast<std::chrono::milliseconds>(
std::chrono::high_resolution_clock::now().time_since_epoch()).count();
}
void SBomber::TimeFinish() {
finishTime = std::chrono::duration_cast<std::chrono::milliseconds>(
std::chrono::high_resolution_clock::now().time_since_epoch()).count();
deltaTime = uint16_t(finishTime - startTime);
passedTime += deltaTime;
MyTools::LoggerSingleton::getInstance().WriteToLog(std::string(__func__) + " deltaTime = ", (int)deltaTime);
}
void SBomber::DropBomb() {
if (bombsNumber > 0) {
MyTools::LoggerSingleton::getInstance().WriteToLog(std::string(__func__) + " was invoked"); MyTools::LoggerSingleton::getInstance().WriteToLog(std::string(__func__) + " was invoked");
Plane* pPlane = FindPlane(); auto pFactory = new RegularFactory;
double x = pPlane->GetX() + 4;
double y = pPlane->GetY() + 2;
Bomb* pBomb = new Bomb; vecDynamicObj.push_back(pFactory->createPlane());
pBomb->SetDirection(0.3, 1); vecStaticObj.push_back(pFactory->createUI(passedTime, fps, bombsNumber, score));
pBomb->SetSpeed(2); vecStaticObj.push_back(pFactory->createGround());
pBomb->SetPos(x, y); vecStaticObj.push_back(pFactory->createTank(30));
pBomb->SetWidth(SMALL_CRATER_SIZE); vecStaticObj.push_back(pFactory->createTank(50));
vecStaticObj.push_back(pFactory->createHouse(80));
vecDynamicObj.push_back(pBomb); delete pFactory;
bombsNumber--; }
score -= Bomb::BombCost;
} SBomber::~SBomber()
{
for (size_t i = 0; i < vecDynamicObj.size(); i++)
{
if (vecDynamicObj[i] != nullptr)
{
delete vecDynamicObj[i];
}
}
for (size_t i = 0; i < vecStaticObj.size(); i++)
{
if (vecStaticObj[i] != nullptr)
{
delete vecStaticObj[i];
}
}
}
void SBomber::MoveObjects()
{
MyTools::LoggerSingleton::getInstance().WriteToLog(std::string(__func__) + " was invoked");
for (size_t i = 0; i < vecDynamicObj.size(); i++)
{
if (vecDynamicObj[i] != nullptr)
{
vecDynamicObj[i]->Move(deltaTime);
}
}
}
;
void SBomber::CheckObjects()
{
MyTools::LoggerSingleton::getInstance().WriteToLog(std::string(__func__) + " was invoked");
CheckPlaneAndLevelGUI();
CheckBombsAndGround();
}
;
void SBomber::CheckPlaneAndLevelGUI()
{
if (FindPlane()->GetX() > FindLevelGUI()->GetFinishX())
{
exitFlag = true;
}
}
void SBomber::CheckBombsAndGround()
{
std::vector<Bomb*> vecBombs = FindAllBombs();
Ground *pGround = FindGround();
const double y = pGround->GetY();
for (size_t i = 0; i < vecBombs.size(); i++)
{
if (vecBombs[i]->GetY() >= y)
{
pGround->AddCrater(vecBombs[i]->GetX());
CheckDestoyableObjects(vecBombs[i]);
DeleteCommand<DynamicObject> delCom(SBomber::vecDynamicObj);
delCom.setObj(vecBombs[i]);
delCom.Execute();
}
}
}
void SBomber::CheckDestoyableObjects(Bomb *pBomb)
{
std::vector<DestroyableGroundObject*> vecDestoyableObjects = FindDestoyableGroundObjects();
const double size = pBomb->GetWidth();
const double size_2 = size / 2;
for (size_t i = 0; i < vecDestoyableObjects.size(); i++)
{
const double x1 = pBomb->GetX() - size_2;
const double x2 = x1 + size;
if (vecDestoyableObjects[i]->isInside(x1, x2))
{
score += vecDestoyableObjects[i]->GetScore();
DeleteCommand<GameObject> delCom(SBomber::vecStaticObj);
delCom.setObj(vecDestoyableObjects[i]);
delCom.Execute();
}
}
}
std::vector<DestroyableGroundObject*> SBomber::FindDestoyableGroundObjects() const
{
std::vector<DestroyableGroundObject*> vec;
Tank *pTank;
House *pHouse;
for (size_t i = 0; i < vecStaticObj.size(); i++)
{
pTank = dynamic_cast<Tank*>(vecStaticObj[i]);
if (pTank != nullptr)
{
vec.push_back(pTank);
continue;
}
pHouse = dynamic_cast<House*>(vecStaticObj[i]);
if (pHouse != nullptr)
{
vec.push_back(pHouse);
continue;
}
}
return vec;
}
Ground* SBomber::FindGround() const
{
Ground *pGround;
for (size_t i = 0; i < vecStaticObj.size(); i++)
{
pGround = dynamic_cast<Ground*>(vecStaticObj[i]);
if (pGround != nullptr)
{
return pGround;
}
}
return nullptr;
}
std::vector<Bomb*> SBomber::FindAllBombs() const
{
std::vector<Bomb*> vecBombs;
for (size_t i = 0; i < vecDynamicObj.size(); i++)
{
Bomb *pBomb = dynamic_cast<Bomb*>(vecDynamicObj[i]);
if (pBomb != nullptr)
{
vecBombs.push_back(pBomb);
}
}
return vecBombs;
}
Plane* SBomber::FindPlane() const
{
for (size_t i = 0; i < vecDynamicObj.size(); i++)
{
Plane *p = dynamic_cast<Plane*>(vecDynamicObj[i]);
if (p != nullptr)
{
return p;
}
}
return nullptr;
}
LevelGUI* SBomber::FindLevelGUI() const
{
for (size_t i = 0; i < vecStaticObj.size(); i++)
{
LevelGUI *p = dynamic_cast<LevelGUI*>(vecStaticObj[i]);
if (p != nullptr)
{
return p;
}
}
return nullptr;
}
void SBomber::ProcessKBHit()
{
int c = getchar();
if (c == 224)
{
c = getchar();
}
MyTools::LoggerSingleton::getInstance().WriteToLog(std::string(__func__) + " was invoked. key = ", c);
switch (c)
{
case 27: // esc
exitFlag = true;
break;
case 72: // up
FindPlane()->ChangePlaneY(-0.25);
break;
case 80: // down
FindPlane()->ChangePlaneY(0.25);
break;
case 'b':
{
DropCommand dropCom(SBomber::vecDynamicObj);
dropCom.setParams(FindPlane(), &bombsNumber, &score);
dropCom.Execute();
break;
}
case 'B':
{
DropBigCommand dropCom(SBomber::vecDynamicObj);
dropCom.setParams(FindPlane(), &bombsNumber, &score);
dropCom.Execute();
break;
}
default:
break;
}
}
void SBomber::DrawFrame()
{
MyTools::LoggerSingleton::getInstance().WriteToLog(std::string(__func__) + " was invoked");
for (size_t i = 0; i < vecDynamicObj.size(); i++)
{
if (vecDynamicObj[i] != nullptr)
{
vecDynamicObj[i]->Draw();
}
}
for (size_t i = 0; i < vecStaticObj.size(); i++)
{
if (vecStaticObj[i] != nullptr)
{
vecStaticObj[i]->Draw();
}
}
ScreenSingleton::getInstance().GotoXY(0, 0);
fps++;
FindLevelGUI()->SetParam(passedTime, fps, bombsNumber, score);
}
void SBomber::TimeStart()
{
MyTools::LoggerSingleton::getInstance().WriteToLog(std::string(__func__) + " was invoked");
startTime = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::high_resolution_clock::now().time_since_epoch()).count();
}
void SBomber::TimeFinish()
{
finishTime = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::high_resolution_clock::now().time_since_epoch()).count();
deltaTime = uint16_t(finishTime - startTime);
passedTime += deltaTime;
MyTools::LoggerSingleton::getInstance().WriteToLog(std::string(__func__) + " deltaTime = ", (int) deltaTime);
}
void SBomber::run()
{
do
{
TimeStart();
if (_kbhit())
{
ProcessKBHit();
}
ScreenSingleton::getInstance().ClrScr();
DrawFrame();
MoveObjects();
CheckObjects();
TimeFinish();
} while (!GetExitFlag());
} }

1030
hw2.patch Normal file

File diff suppressed because it is too large Load Diff