diff --git a/src/editor/EventBroker.hpp b/src/editor/EventBroker.hpp index fa773131f5a1b99ff1aa813c7c49b695689916b2..6d0e7f862fadce2e494631abe2b94c53f292b520 100644 --- a/src/editor/EventBroker.hpp +++ b/src/editor/EventBroker.hpp @@ -17,13 +17,13 @@ public: virtual void onLevelWriteRequested(){}; - virtual void onTileEntered(Tile* tile){}; + virtual void onTileEntered(int index){}; - virtual void onTileExited(Tile* tile){}; + virtual void onTileExited(int index){}; - virtual void onTileClicked(Tile* tile){}; + virtual void onTileClicked(int index){}; - virtual void onTileSelected(uint8_t id){}; + virtual void onNewTileIdSelected(uint8_t tile_id){}; private: static std::vector<EventBroker*> instances ; diff --git a/src/editor/LevelScene.cpp b/src/editor/LevelScene.cpp index 74b61fe0703405e41efefc9c9ece36ae957d8e3c..30d5d0c3ec8cd28c77e0b8fa08ebba6b8d0a120b 100644 --- a/src/editor/LevelScene.cpp +++ b/src/editor/LevelScene.cpp @@ -1,25 +1,43 @@ #include "LevelScene.hpp" #include "SpriteProvider.hpp" #include <QGraphicsPixmapItem> +#include <QPixmap> +#include <QPoint> #include "highfive/H5File.hpp" #include <boost/property_tree/ptree.hpp> #include <boost/property_tree/xml_parser.hpp> -LevelScene::LevelScene(const std::string& name, int width, int height, std::vector<Tile*> tiles, const std::string& file_path, QWidget *parent) : QGraphicsScene(parent), name(name), width(width), height(height), tiles(tiles), file_path(file_path), active_tile(nullptr), active_tile_marker(nullptr), hovered_tile_marker(nullptr) { +LevelScene::LevelScene(const std::string& name, int width, int height, std::vector<uint8_t> tile_ids, const std::string& file_path, QWidget *parent) : QGraphicsScene(parent), name(name), width(width), height(height), tile_ids(tile_ids), file_path(file_path), selected_tile_id(2) { this->setSceneRect(0, 0, width*16, height*16); + std::vector<QGraphicsPixmapItem*> tile_occupants; for (int index = 0; index < width*height; index++) { - position(tiles[index], index); - createChildOn(tiles[index]); + int x = (index % width) * 16; + int y = (index / width) * 16; + Tile* tile = new Tile(index); + this->addItem(tile); + tile->setZValue(0); + tile->setPos(x, y); + if (tile_ids[index] > 0) { + QPixmap tile_occupant = SpriteProvider::get_sprite(tile_ids[index]); + QGraphicsPixmapItem* tile_occupant_item = addPixmap(tile_occupant); + tile_occupant_item->setZValue(tile_ids[index] < 50 ? 1 : 2 + index); + tile_occupant_item->setPos(x, tile_ids[index] < 50 ? y : y - 16); + tile_occupants.push_back(tile_occupant_item); + } + else { + tile_occupants.push_back(nullptr); + } } + this->tile_occupants = tile_occupants; } LevelScene *LevelScene::empty(const std::string& name, int width, int height, QWidget *parent) { - std::vector<Tile*> tiles(width*height); + std::vector<uint8_t> tile_ids(width*height); for (int i = 0; i < width*height; i++) { - tiles[i] = new Tile(0); + tile_ids[i] = 0; } - return new LevelScene(name, width, height, tiles, "../res/level_new.h5", parent); + return new LevelScene(name, width, height, tile_ids, "../res/level_new.h5", parent); } LevelScene *LevelScene::fromFile(const std::string &file_path, QWidget *parent) @@ -42,12 +60,7 @@ LevelScene *LevelScene::fromFile(const std::string &file_path, QWidget *parent) int height = pt.get<int>("level.height"); std::string name = pt.get<std::string>("level.name"); - std::vector<Tile*> tiles; - for (int i = 0; i < width*height; i++) { - tiles.push_back(new Tile(level_tilesarray[i])); - } - - return new LevelScene(name, width, height, tiles, file_path, parent); + return new LevelScene(name, width, height, level_tilesarray, file_path, parent); } std::string LevelScene::getName() @@ -65,40 +78,6 @@ int LevelScene::getHeight() return height; } -void LevelScene::position(Tile *tile, int index) -{ - int x = (index % width) * 16; - int y = (index / width) * 16; - this->addItem(tile); - tile->setPos(x, y); - tile->setZValue(0); -} - -void LevelScene::createChildOn(Tile *tile) -{ - if (tile->getId() == 0) return; - QPixmap pixmap = SpriteProvider::get_sprite(tile->getId()); - QGraphicsPixmapItem* child = this->addPixmap(pixmap); - tile->setChild(child); - child->setPos(tile->x(), tile->y()); - child->setZValue(1); - if (tile->getId() >= 50) { - child->setPos(tile->x(), tile->y() - 16); - child->setZValue(2 + tile->y()*width + tile->x()); - } -} - -QGraphicsRectItem *LevelScene::createMarkerOn(Tile *tile) -{ - QColor marker_color(0, 0, 0, 128); - QPen marker_pen(Qt::transparent);; - QBrush marker_brush(marker_color); - QGraphicsRectItem* marker_item = this->addRect(0, 0, 16, 16, marker_pen, marker_brush); - marker_item->setZValue(std::numeric_limits<qreal>::max()); - marker_item->setPos(tile->x(), tile->y()); - return marker_item; -} - void LevelScene::onLevelNameUpdated(std::string new_name) { this->name = new_name; @@ -118,53 +97,55 @@ void LevelScene::onLevelWriteRequested() boost::property_tree::write_xml(xmlStream, pt); std::string xml_data = xmlStream.str(); - - // create tiles_array - std::vector<uint8_t> tiles_array; - for (int i = 0; i < width*height; i++) { - tiles_array.push_back(tiles[i]->getId()); - } - // write level to hdf5 HighFive::File file(file_path, HighFive::File::Truncate); file.createDataSet<std::string>("metadata", HighFive::DataSpace::From(xmlStream)).write(xml_data); - file.createDataSet<uint8_t>("tilesarray", HighFive::DataSpace::From(tiles_array)).write(tiles_array); + file.createDataSet<uint8_t>("tilesarray", HighFive::DataSpace::From(tile_ids)).write(tile_ids); } -void LevelScene::onTileEntered(Tile *tile) +void LevelScene::onTileEntered(int index) { - QGraphicsRectItem* marker = createMarkerOn(tile); - hovered_tile_marker = marker; + std::cout << "lol" << std::endl; + if (selected_tile_id == tile_ids[index]) return; + std::cout << "lolll" << std::endl; + std::cout << tile_occupants.size() << std::endl; + std::cout << tile_occupants[index] << std::endl; + if (tile_occupants[index] != nullptr) removeItem(tile_occupants[index]); + tile_occupants[index] = nullptr; + std::cout << "some" << std::endl; + if (selected_tile_id > 0) { + tile_occupants[index] = occupy_tile(index, selected_tile_id); + } } -void LevelScene::onTileExited(Tile *tile) +void LevelScene::onTileExited(int index) { - if (hovered_tile_marker != nullptr) { - this->removeItem(hovered_tile_marker); + if (selected_tile_id == tile_ids[index]) return; + if (tile_occupants[index] != nullptr) removeItem(tile_occupants[index]); + tile_occupants[index] = nullptr; + if (tile_ids[index] > 0) { + tile_occupants[index] = occupy_tile(index, tile_ids[index]); } } -void LevelScene::onTileClicked(Tile *tile) +void LevelScene::onTileClicked(int index) { - if (active_tile_marker != nullptr) { - this->removeItem(active_tile_marker); - } - active_tile = tile; - QGraphicsRectItem* marker = createMarkerOn(tile); - active_tile_marker = marker; + tile_ids[index] = selected_tile_id; } -void LevelScene::onTileSelected(uint8_t id) { - if (active_tile == nullptr) return; - active_tile->setId(id); - if (active_tile->getChild() != nullptr) { - this->removeItem(active_tile->getChild()); - } - if (id > 0) { - createChildOn(active_tile); - } - else { - active_tile->setChild(nullptr); - } +void LevelScene::onNewTileIdSelected(uint8_t tile_id) +{ + this->selected_tile_id = tile_id; } +QGraphicsPixmapItem *LevelScene::occupy_tile(int index, uint8_t tile_id) +{ + if (tile_id == 0) return nullptr; + int x = (index % width) * 16; + int y = (index / width) * 16; + QPixmap tile_occupant = SpriteProvider::get_sprite(tile_id); + QGraphicsPixmapItem* tile_occupant_item = addPixmap(tile_occupant); + tile_occupant_item->setZValue(tile_id < 50 ? 1 : 2 + index); + tile_occupant_item->setPos(x, tile_id < 50 ? y : y - 16); + return tile_occupant_item; +} diff --git a/src/editor/LevelScene.hpp b/src/editor/LevelScene.hpp index 80f40cdb5c9044dbcc2789f38bfbde638d31721c..74e59a23aea476f7b81e2d568255cae2e989a0a9 100644 --- a/src/editor/LevelScene.hpp +++ b/src/editor/LevelScene.hpp @@ -11,29 +11,26 @@ class LevelScene : public QGraphicsScene, public EventBroker { public: - LevelScene(const std::string& name, int width, int height, std::vector<Tile*> tiles, const std::string& file_path, QWidget *parent = nullptr); + LevelScene(const std::string& name, int width, int height, std::vector<uint8_t> tile_ids, const std::string& file_path, QWidget *parent = nullptr); static LevelScene* empty(const std::string& name, int width, int height, QWidget *parent = nullptr); static LevelScene* fromFile(const std::string& file_path, QWidget *parent = nullptr); std::string getName(); int getWidth(); int getHeight(); private: - void position(Tile* tile, int index); - void createChildOn(Tile* tile); - QGraphicsRectItem* createMarkerOn(Tile* tile); void onLevelNameUpdated(std::string new_name) override; void onLevelWriteRequested() override; - void onTileEntered(Tile* tile) override; - void onTileExited(Tile* tile) override; - void onTileClicked(Tile* tile) override; - void onTileSelected(uint8_t id) override; - Tile* active_tile; - QGraphicsRectItem* active_tile_marker; - QGraphicsRectItem* hovered_tile_marker; + void onTileEntered(int index) override; + void onTileExited(int index) override; + void onTileClicked(int index) override; + void onNewTileIdSelected(uint8_t tile_id) override; + QGraphicsPixmapItem* occupy_tile(int index, uint8_t tile_id); + uint8_t selected_tile_id; std::string name; int width; int height; - std::vector<Tile*> tiles; + std::vector<uint8_t> tile_ids; + std::vector<QGraphicsPixmapItem*> tile_occupants; std::string file_path; }; diff --git a/src/editor/Tile.cpp b/src/editor/Tile.cpp index 1f688c5a680c57cacd454ea78061798c23f9f64f..7d4ad44ccf147099326b85873a279352588af0fb 100644 --- a/src/editor/Tile.cpp +++ b/src/editor/Tile.cpp @@ -2,41 +2,24 @@ #include "SpriteProvider.hpp" #include "EventBroker.hpp" -Tile::Tile(uint8_t id) : QGraphicsPixmapItem(SpriteProvider::get_sprite(0)), id(id), child(nullptr) { +Tile::Tile(int index) : QGraphicsPixmapItem(SpriteProvider::get_sprite(0)), index(index) { this->setAcceptHoverEvents(true); } -uint8_t Tile::getId() -{ - return id; -} - -uint8_t Tile::setId(uint8_t id) -{ - this->id = id; -} - -QGraphicsPixmapItem *Tile::getChild() -{ - return child; -} - -QGraphicsPixmapItem *Tile::setChild(QGraphicsPixmapItem *child) -{ - this->child = child; -} - void Tile::hoverEnterEvent(QGraphicsSceneHoverEvent *event) { - EventBroker::send([this](EventBroker* e){e->onTileEntered(this);}); + int index = this->index; + EventBroker::send([index](EventBroker* e){e->onTileEntered(index);}); } void Tile::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) { - EventBroker::send([this](EventBroker* e){e->onTileExited(this);}); + int index = this->index; + EventBroker::send([index](EventBroker* e){e->onTileExited(index);}); } void Tile::mousePressEvent(QGraphicsSceneMouseEvent *event) { - EventBroker::send([this](EventBroker* e){e->onTileClicked(this);}); + int index = this->index; + EventBroker::send([index](EventBroker* e){e->onTileClicked(index);}); } diff --git a/src/editor/Tile.hpp b/src/editor/Tile.hpp index ef87fc36a0e9ddc35034f4e1edae7d35df1ceed3..325d4d9fcff393a9b099de994a857cd242ed301d 100644 --- a/src/editor/Tile.hpp +++ b/src/editor/Tile.hpp @@ -3,18 +3,11 @@ class Tile : public QGraphicsPixmapItem { public: - Tile(uint8_t id); - uint8_t getId(); - uint8_t setId(uint8_t id); - QGraphicsPixmapItem* getChild(); - QGraphicsPixmapItem* setChild(QGraphicsPixmapItem* child); + Tile(int index); -protected: +private: void hoverEnterEvent(QGraphicsSceneHoverEvent *event) override; void hoverLeaveEvent(QGraphicsSceneHoverEvent *event) override; void mousePressEvent(QGraphicsSceneMouseEvent *event) override; - -private: - uint8_t id; - QGraphicsPixmapItem* child; + int index; }; \ No newline at end of file diff --git a/src/editor/TileButton.cpp b/src/editor/TileButton.cpp index 056b65627c43dca07e1399e9d7e9d968745392ec..a1597038ab11b7ab31dde397af8469915d304c75 100644 --- a/src/editor/TileButton.cpp +++ b/src/editor/TileButton.cpp @@ -13,5 +13,5 @@ TileButton::TileButton(const uint8_t id, QWidget *parent) : QPushButton(parent), void TileButton::mousePressEvent(QMouseEvent *event){ QPushButton::mousePressEvent(event); uint8_t tile_id = id; - EventBroker::send([tile_id](EventBroker* e){e->onTileSelected(tile_id);}); + EventBroker::send([tile_id](EventBroker* e){e->onNewTileIdSelected(tile_id);}); }