draw game improvement

This commit is contained in:
ProgramSnail 2021-04-11 20:14:23 +03:00
parent bee718ad9b
commit 220dd71d8f
15 changed files with 274 additions and 75 deletions

View file

@ -1,32 +1,168 @@
#include "draw.hpp"
#include "game_draw.hpp"
#include "draw.hpp"
namespace game_draw {
const size_t MENU_WIDTH = 16;
const size_t MENU_ENTITY_EXTRA = 4;
const draw::ColorScheme menuSimpleScheme =
draw::ColorScheme::menu_simple;
const draw::ColorScheme menuActiveScheme =
draw::ColorScheme::menu_active;
size_t lastWidth = 0;
size_t lastHeight = 0;
void drawMenuEntity(size_t pos, size_t start, size_t end,
char shortkey, draw::Cell type,
const std::string& name, bool isActive) {
draw::ColorScheme colorScheme =
isActive ? menuActiveScheme : menuSimpleScheme;
draw::drawKey(start, pos, shortkey, colorScheme);
draw::drawCh(start + 1, pos, draw::Cell::blank, colorScheme);
for (size_t i = 0; i <= end - start - MENU_ENTITY_EXTRA; ++i) {
if (i < name.size()) {
draw::drawKey(start + 2 + i, pos,
name[i], colorScheme);
} else {
draw::drawCh(start + 2 + i, pos,
draw::Cell::blank, colorScheme);
}
}
// ?? add move of name ??
draw::drawCh(end - 1, pos, draw::Cell::blank, colorScheme);
draw::drawCh(end, pos, type, colorScheme);
}
void drawMenu(std::pair<size_t, size_t> start,
std::pair<size_t, size_t> end) {
for (size_t i = start.second; i <= end.second; ++i) {
// add real entities
drawMenuEntity(i, start.first, end.first, 'A',
draw::Cell::unit, "Tank", false);
}
}
void drawMap(std::pair<size_t, size_t> start,
std::pair<size_t, size_t> end) {
}
void drawParams(std::pair<size_t, size_t> start,
const std::vector<std::pair<int, draw::Cell>> &res) {
size_t pos = start.first;
for (size_t i = 0; i < res.size(); ++i) {
std::string s = std::to_string(res[i].first);
for (size_t j = 0; j < s.size(); ++j, ++pos) {
draw::drawKey(pos, start.second,
s[j], menuSimpleScheme);
}
draw::drawCh(pos++, start.second,
res[i].second, menuSimpleScheme);
draw::drawCh(pos++, start.second,
draw::Cell::blank, menuSimpleScheme);
}
}
void drawRequirements(std::pair<size_t, size_t> end,
const std::vector<draw::Cell> &requirements) {
size_t pos = end.first;
for (size_t i = 0; i < requirements.size(); ++i) {
draw::drawCh(pos--, end.second,
requirements[i], menuSimpleScheme);
draw::drawCh(pos--, end.second,
draw::Cell::blank, menuSimpleScheme);
}
draw::drawCh(pos, end.second,
draw::Cell::menu_vb, menuSimpleScheme);
}
void drawAll() {
size_t width;
size_t height;
draw::getSize(width, height);
// check width && height
for(size_t i = 0; i < height; ++i) {
draw::drawCh(i, 0, draw::Cell::menu_hb);
draw::drawCh(i, width - 1, draw::Cell::menu_hb);
draw::drawCh(i, width - MENU_WIDTH, draw::Cell::menu_hb);
size_t menuBorderLeft = width - MENU_WIDTH - 3;
size_t menuBorderDown = height - 3;
size_t borderUp = 1;
size_t borderDown = height - 1;
size_t borderLeft = 0;
size_t borderRight = width - 1;
if (width != lastWidth || height != lastHeight) {
draw::clearAll();
}
for(size_t i = 0; i < width; ++i) {
draw::drawCh(0, i, draw::Cell::menu_vb);
draw::drawCh(height - 1, i, draw::Cell::menu_vb);
// draw borders
for(size_t i = borderUp + 1; i < borderDown; ++i) {
draw::drawCh(0, i,
draw::Cell::menu_vb, menuSimpleScheme);
draw::drawCh(menuBorderLeft, i,
draw::Cell::menu_vb, menuSimpleScheme);
draw::drawCh(borderRight, i,
draw::Cell::menu_vb, menuSimpleScheme);
}
for(size_t i = borderLeft + 1; i < borderRight; ++i) {
draw::drawCh(i, borderUp, draw::Cell::menu_hb,
menuSimpleScheme);
draw::drawCh(i, borderDown, draw::Cell::menu_hb,
menuSimpleScheme);
}
for (size_t i = menuBorderLeft + 1; i < borderRight; ++i) {
draw::drawCh(i, menuBorderDown, draw::Cell::menu_hb,
menuSimpleScheme);
}
// draw corners
{
std::vector<std::pair<size_t, size_t>> corners = {
{borderLeft, borderUp},
{menuBorderLeft, borderUp},
{borderRight, borderUp},
{menuBorderLeft, menuBorderDown},
{borderRight, menuBorderDown},
{borderLeft, borderDown},
{menuBorderLeft, borderDown},
{borderRight, borderDown}
};
for (size_t i = 0; i < corners.size(); ++i) {
draw::drawCh(corners[i].first,
corners[i].second, draw::Cell::menu_c,
menuSimpleScheme);
}
}
drawMenu({menuBorderLeft + 1, borderUp + 1},
{borderRight - 1, menuBorderDown - 1});
drawMap({borderLeft + 1, borderUp + 1},
{menuBorderLeft - 1, borderDown - 1});
// resources
drawParams({0, 0}, std::vector<std::
pair<int, draw::Cell>>({
{1023, draw::Cell::gold},
{324, draw::Cell::iron},
{545, draw::Cell::tech}
})); // test
// draw build requirements
drawRequirements({width - 1, 0}, std::
vector<draw::Cell>(5, draw::Cell::unit)); // test
// cost
drawParams({menuBorderLeft + 1, menuBorderDown + 1},
std::vector<std::pair<int, draw::Cell>>({
{120, draw::Cell::gold},
{400, draw::Cell::iron},
{15, draw::Cell::tech}
})); // test
lastWidth = width;
lastHeight = height;
}
void drawMenu(std::pair<size_t, size_t> start, std::pair<size_t, size_t> end) {
}
void drawMap(std::pair<size_t, size_t> start, std::pair<size_t, size_t> end) {
}
}