#include "combat_ui.hpp" #include "constants.hpp" #include "color.hpp" namespace gui { CombatUI::CombatUI(GameLevel level) : $layout(RAY_VIEW_X, RAY_VIEW_HEIGHT, RAY_VIEW_WIDTH, SCREEN_HEIGHT - RAY_VIEW_HEIGHT), $level(level), $font{FONT_FILE_NAME} { bool good = $layout.parse($grid); dbc::check(good, "failed to parse combat layout"); render(); } void CombatUI::render() { for(auto& [name, cell] : $layout.cells) { sf::RectangleShape button; button.setPosition({float(cell.x + 10), float(cell.y + 10)}); button.setSize({float(cell.w - 20), float(cell.h - 20)}); button.setFillColor({100, 100, 100}); button.setOutlineColor({200, 200, 200}); button.setOutlineThickness(5); $shapes.insert_or_assign(name, button); sf::Text label($font, name); auto bounds = label.getLocalBounds(); auto label_cell = lel::center(bounds.size.x, bounds.size.y, cell); // this stupid / 2 is because SFML renders from baseline rather than from the claimed bounding box label.setPosition({float(label_cell.x), float(label_cell.y) - label_cell.h / 2}); $labels.push_back(label); } } void CombatUI::draw(sf::RenderWindow& window) { for(auto& [name, shape] : $shapes) { window.draw(shape); } for(auto& [name, shape] : $label_boxes) { window.draw(shape); } for(auto& label : $labels) { window.draw(label); } } void CombatUI::click(int x, int y) { if(auto name = $layout.hit(x, y)) { auto& shape = $shapes.at(*name); shape.setFillColor({100, 0, 0}); } } }