summaryrefslogtreecommitdiff
path: root/src/floor.cpp
blob: aacf77e6393102176b6b2500a3194ebd16206915 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include "floor.hpp"

#include <SFML/Graphics/RectangleShape.hpp>
#include <SFML/Graphics/RenderWindow.hpp>
#include <SFML/Graphics/Sprite.hpp>
#include <SFML/System/Angle.hpp>
#include <SFML/System/Vector2.hpp>
#include <algorithm>
#include <iterator>

#include "tileset.hpp"

namespace silly::editor {
  void TileFloor::render(sf::RenderWindow &window) const {
    for (auto l = this->layers.begin(); l != this->layers.end(); ++l) {
      for (auto t = l->tiles.begin(); t != l->tiles.end(); ++t) {
        sf::Sprite s(t->tile->texture);
        s.setPosition({t->position.x * (float)TILE_WIDTH,
                       t->position.y * (float)TILE_HEIGHT});
        s.setRotation(sf::degrees(t->rotation));

        sf::Vector2f origin;
        sf::Vector2u size = t->tile->texture.getSize();

        if (t->rotation == 90.0f) {
          origin.y = size.y;
        } else if (t->rotation == 180.0f) {
          origin.x = size.x;
          origin.y = size.y;
        } else if (t->rotation == 270.0f) {
          origin.x = size.x;
        }

        s.setOrigin(origin);

        window.draw(s);
      }
    }
  }

  void TileFloor::place_tile(std::shared_ptr<TilesetTile> &tile,
                             const sf::Vector2i &position,
                             const float &rotation) {
    TileLayer &layer = this->layers.at(tile->type);
    bool placed = false;

    for (auto it = layer.tiles.begin(); it != layer.tiles.end(); ++it) {
      if (it->position != position) continue;

      it->rotation = rotation;
      it->tile = tile;
      placed = true;
      break;
    }

    if (!placed) {
      layer.tiles.push_back({tile, position, rotation});
    }
  }
  void TileFloor::remove_tile(TilesetTileType type,
                              const sf::Vector2i &position) {
    TileLayer &layer = this->layers.at(type);

    layer.tiles.resize(std::distance(
        layer.tiles.begin(),
        std::remove_if(
            layer.tiles.begin(), layer.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; }
}