#pragma once #include "color.hpp" #include "dinkyecs.hpp" #include "lel.hpp" #include #include #include #include "texture.hpp" using std::shared_ptr, std::make_shared; struct Textual { std::string label; shared_ptr font = nullptr; shared_ptr text = nullptr; void init(lel::Cell &cell, shared_ptr font_ptr) { font = font_ptr; text = make_shared(*font, label); auto bounds = text->getLocalBounds(); auto text_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 text->setPosition({float(text_cell.x), float(text_cell.y) - text_cell.h / 2}); } }; struct Clickable { int event = 0; }; struct Sprite { std::string name; std::shared_ptr sprite = nullptr; std::shared_ptr texture = nullptr; }; struct Rectangle { shared_ptr shape = nullptr; void init(lel::Cell& cell) { sf::Vector2f size{(float)cell.w, (float)cell.h}; if(shape == nullptr) shape = make_shared(size); shape->setPosition({float(cell.x + 3), float(cell.y + 3)}); shape->setSize({float(cell.w - 6), float(cell.h - 6)}); shape->setFillColor(ColorValue::DARK_MID); shape->setOutlineColor(ColorValue::MID); shape->setOutlineThickness(1); } }; struct Meter { float percent = 100.0; }; struct CellName { std::string name; }; class GUECS { public: DinkyECS::World $world; shared_ptr $font = nullptr; lel::Parser $parser; std::string $grid = ""; GUECS(); void position(int x, int y, int width, int height); void layout(std::string grid); DinkyECS::Entity entity(std::string name); inline lel::CellMap& cells() { return $parser.cells; } inline DinkyECS::World& world() { return $world; } void init(TexturePack& textures); void render(sf::RenderWindow& window); void mouse(sf::RenderWindow &window); };