From e7536175164e8ba816041971d9f2ab88082b0a6f Mon Sep 17 00:00:00 2001 From: ilotterytea Date: Sun, 2 Feb 2025 02:54:34 +0500 Subject: feat: windows for creating a new level and floor --- src/editor.cpp | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++- src/editor.hpp | 13 ++++++++++ src/level.cpp | 2 +- src/level.hpp | 6 ++--- src/main.cpp | 4 +-- src/package.hpp | 2 +- 6 files changed, 99 insertions(+), 8 deletions(-) diff --git a/src/editor.cpp b/src/editor.cpp index 74632b7..2ac2f95 100644 --- a/src/editor.cpp +++ b/src/editor.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -71,7 +72,8 @@ namespace silly::editor { // tile placement if ((sf::Mouse::isButtonPressed(sf::Mouse::Button::Left) || sf::Mouse::isButtonPressed(sf::Mouse::Button::Right)) && - !this->package.get_levels().empty()) { + !this->package.get_levels().empty() && + !this->package.get_current_level().get_floors().empty()) { sf::Vector2f mousePosition = window.mapPixelToCoords(sf::Mouse::getPosition(window)); @@ -115,6 +117,64 @@ namespace silly::editor { } } + void Editor::createNewFloor(const sf::RenderWindow &window) { + sf::Vector2u windowSize = window.getSize(); + + NewFloorState &state = this->newFloorState.value(); + + ImGui::SetNextWindowPos( + ImVec2(windowSize.x / 2.0f - 100, windowSize.y / 2.0f - 50)); + ImGui::SetNextWindowSize(ImVec2(200, 100)); + ImGui::Begin("New floor", NULL, + ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize); + + ImGui::InputInt("Width", &state.width); + ImGui::InputInt("Height", &state.height); + + state.width = std::min(std::max(state.width, 1), 100); + state.height = std::min(std::max(state.height, 1), 100); + + if (ImGui::Button("Create")) { + TileFloor floor(state.width, state.height); + this->package.get_current_level().add_floor(floor); + ImGui::SetWindowCollapsed(true); + } + + if (ImGui::IsWindowCollapsed()) { + ImGui::SetWindowCollapsed(false); + this->newFloorState = std::nullopt; + } + + ImGui::End(); + } + + void Editor::createNewLevel(const sf::RenderWindow &window) { + sf::Vector2u windowSize = window.getSize(); + + NewLevelState &state = this->newLevelState.value(); + + ImGui::SetNextWindowPos( + ImVec2(windowSize.x / 2.0f - 100, windowSize.y / 2.0f - 40)); + ImGui::SetNextWindowSize(ImVec2(200, 80)); + ImGui::Begin("New level", NULL, + ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize); + + ImGui::InputText("Name", (char *)state.name.c_str(), sizeof(state.name)); + + if (ImGui::Button("Create")) { + TileLevel level(state.name); + this->package.add_level(level); + ImGui::SetWindowCollapsed(true); + } + + if (ImGui::IsWindowCollapsed()) { + ImGui::SetWindowCollapsed(false); + this->newLevelState = std::nullopt; + } + + ImGui::End(); + } + void Editor::render(const sf::RenderWindow &window) { sf::Vector2u windowSize = window.getSize(); @@ -124,6 +184,24 @@ namespace silly::editor { int x = windowSize.x - width; int y = 0; + if (package.get_levels().empty()) { + if (!this->newLevelState.has_value()) { + this->newLevelState = std::make_optional((NewLevelState){}); + } + + this->createNewLevel(window); + return; + } + + if (package.get_current_level().get_floors().empty()) { + if (!this->newFloorState.has_value()) { + this->newFloorState = std::make_optional((NewFloorState){}); + } + + this->createNewFloor(window); + return; + } + ImGui::SetNextWindowPos(ImVec2(x, y)); ImGui::SetNextWindowSize(ImVec2(width, height)); ImGui::Begin("Editor", NULL, diff --git a/src/editor.hpp b/src/editor.hpp index 1e055e6..0851e5c 100644 --- a/src/editor.hpp +++ b/src/editor.hpp @@ -18,6 +18,14 @@ namespace silly::editor { TilesetTileType type; }; + struct NewLevelState { + std::string name; + }; + + struct NewFloorState { + int width = 10, height = 10; + }; + class Editor { public: Editor(LevelPackage &package) : package(package) {} @@ -28,6 +36,9 @@ namespace silly::editor { const float get_zoom() const; private: + void createNewLevel(const sf::RenderWindow &window); + void createNewFloor(const sf::RenderWindow &window); + LevelPackage &package; float rotation; @@ -38,5 +49,7 @@ namespace silly::editor { std::optional> selectedTile; std::optional newTileState; + std::optional newLevelState; + std::optional newFloorState; }; } \ No newline at end of file diff --git a/src/level.cpp b/src/level.cpp index bee3297..8e9ba81 100644 --- a/src/level.cpp +++ b/src/level.cpp @@ -72,7 +72,7 @@ namespace silly::editor { const int TileFloor::get_width() const { return this->width; } const int TileFloor::get_height() const { return this->height; } - void TileLevel::add_floor(TileFloor &floor) { this->floors.push_back(floor); } + void TileLevel::add_floor(TileFloor floor) { this->floors.push_back(floor); } void TileLevel::move_to_floor(int floor_id) { this->current_floor = std::min(floor_id, (int)this->floors.size() - 1); diff --git a/src/level.hpp b/src/level.hpp index 2364413..c5eb1ea 100644 --- a/src/level.hpp +++ b/src/level.hpp @@ -41,7 +41,7 @@ namespace silly::editor { private: int width, height; - int activeLayerIndex; + int activeLayerIndex = 0; std::vector layers; }; @@ -50,7 +50,7 @@ namespace silly::editor { TileLevel(const std::string &name) : name(name) {} ~TileLevel() = default; - void add_floor(TileFloor &floor); + void add_floor(TileFloor floor); void move_to_floor(int floor_id); TileFloor &get_current_floor(); @@ -61,7 +61,7 @@ namespace silly::editor { private: const std::string name; - int current_floor; + int current_floor = 0; std::vector floors; }; } \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index cc28392..ea33831 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -14,7 +14,6 @@ #include "level.hpp" #include "nfd.hpp" #include "package.hpp" -#include "tileset.hpp" int main() { NFD::Guard nfdGuard; @@ -61,7 +60,8 @@ int main() { window.clear(); - if (!package.get_levels().empty()) { + if (!package.get_levels().empty() && + !package.get_current_level().get_floors().empty()) { silly::editor::TileLevel &level = package.get_current_level(); silly::editor::TileFloor &floor = level.get_current_floor(); floor.render(window); diff --git a/src/package.hpp b/src/package.hpp index d847f83..0ac25e3 100644 --- a/src/package.hpp +++ b/src/package.hpp @@ -30,6 +30,6 @@ namespace silly::editor { Tileset tileset; std::vector levels; - int currentLevelIndex; + int currentLevelIndex = 0; }; } \ No newline at end of file -- cgit v1.2.3