diff options
| author | ilotterytea <iltsu@alright.party> | 2025-02-01 17:14:45 +0500 |
|---|---|---|
| committer | ilotterytea <iltsu@alright.party> | 2025-02-01 17:14:45 +0500 |
| commit | fcb69fd43a029db9f230f701a51338a9fe2ea60b (patch) | |
| tree | 6ef1f580d380b3daa0fb91fdefb010a3217c98bf /src/floor.cpp | |
| parent | 0c7c29d669c16c3821b19d00a9319f3eba5cf05d (diff) | |
feat: ability to place and remove tiles
Diffstat (limited to 'src/floor.cpp')
| -rw-r--r-- | src/floor.cpp | 60 |
1 files changed, 58 insertions, 2 deletions
diff --git a/src/floor.cpp b/src/floor.cpp index fac9ec6..f081008 100644 --- a/src/floor.cpp +++ b/src/floor.cpp @@ -1,6 +1,62 @@ #include "floor.hpp" +#include <SFML/Graphics/RectangleShape.hpp> +#include <SFML/Graphics/RenderWindow.hpp> +#include <SFML/System/Vector2.hpp> +#include <SFML/Window/Mouse.hpp> +#include <algorithm> +#include <iterator> + namespace silly::editor { - const int Floor::get_width() const { return this->width; } - const int Floor::get_height() const { return this->height; } + void TileFloor::update(const sf::RenderWindow &window) { + if (sf::Mouse::isButtonPressed(sf::Mouse::Button::Left) || + sf::Mouse::isButtonPressed(sf::Mouse::Button::Right)) { + sf::Vector2i mousePosition = sf::Mouse::getPosition(window); + + for (int x = 0; x < this->get_width(); x++) { + for (int y = 0; y < this->get_height(); y++) { + int rx = x * 16, ry = y * 16; + + if ((rx < mousePosition.x && mousePosition.x < rx + 16) && + (ry < mousePosition.y && mousePosition.y < ry + 16)) { + sf::Vector2i pos(x, y); + + if (sf::Mouse::isButtonPressed(sf::Mouse::Button::Left)) { + this->place_tile(pos); + } else if (sf::Mouse::isButtonPressed(sf::Mouse::Button::Right)) { + this->remove_tile(pos); + } + } + } + } + } + } + + void TileFloor::render(sf::RenderWindow &window) const { + std::for_each( + this->tiles.begin(), this->tiles.end(), [&window](const Tile &t) { + sf::RectangleShape shape({16, 16}); + shape.setFillColor(sf::Color(255, 190, 190)); + shape.setPosition({t.position.x * 16.0f, t.position.y * 16.0f}); + window.draw(shape); + }); + } + + void TileFloor::place_tile(const sf::Vector2i &position) { + if (!std::any_of( + this->tiles.begin(), this->tiles.end(), + [&position](const Tile &t) { return t.position == position; })) { + this->tiles.push_back({position}); + } + } + void TileFloor::remove_tile(const sf::Vector2i &position) { + this->tiles.resize(std::distance( + this->tiles.begin(), + std::remove_if( + this->tiles.begin(), this->tiles.end(), + [&position](const Tile &t) { return t.position == position; }))); + } + + const int TileFloor::get_width() const { return this->width; } + const int TileFloor::get_height() const { return this->height; } }
\ No newline at end of file |
