71 lines
1.5 KiB
C++
71 lines
1.5 KiB
C++
#include "Ground.h"
|
|
#include "Crater.h"
|
|
#include "ScreenSingleton.h"
|
|
#include "enums/CraterSize.h"
|
|
#include "MyTools.h"
|
|
#include <iostream>
|
|
|
|
void Ground::Draw() const
|
|
{
|
|
ScreenSingleton::getInstance().SetColor(CC_Green);
|
|
|
|
const size_t bufSize = width + 1;
|
|
char* buf = new (std::nothrow) char[bufSize];
|
|
if (buf == nullptr)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (vecCrates.size() == 0)
|
|
{
|
|
ScreenSingleton::getInstance().GotoXY(x, y);
|
|
memset(buf, '=', bufSize);
|
|
buf[bufSize - 1] = '\0';
|
|
std::cout << buf;
|
|
}
|
|
else
|
|
{
|
|
const size_t X = size_t(x);
|
|
char c;
|
|
for (size_t i = X; i < width + X; i++)
|
|
{
|
|
c = (isInsideAnyCrater((double)i)) ? ' ' : '=';
|
|
buf[i - X] = c;
|
|
}
|
|
|
|
ScreenSingleton::getInstance().GotoXY((double)X, y);
|
|
buf[bufSize-1] = '\0';
|
|
std::cout << buf;
|
|
|
|
for (size_t i = 0; i < vecCrates.size(); i++)
|
|
{
|
|
vecCrates[i].Draw();
|
|
}
|
|
}
|
|
|
|
delete[] buf;
|
|
}
|
|
|
|
bool Ground::isInsideAnyCrater(double x) const
|
|
{
|
|
bool isInside = false;
|
|
for (size_t i = 0; i < vecCrates.size(); i++)
|
|
{
|
|
if (vecCrates[i].isInside(x))
|
|
{
|
|
isInside = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
return isInside;
|
|
}
|
|
|
|
void Ground::AddCrater(double xn)
|
|
{
|
|
Crater cr;
|
|
cr.SetPos(int(xn), y);
|
|
cr.SetWidth(SMALL_CRATER_SIZE);
|
|
vecCrates.push_back(cr);
|
|
}
|