From 4f2ccc4820dd58cd72e58797c10e91e84f085f4e Mon Sep 17 00:00:00 2001 From: Sulimov Igor Andreevich <igansulimov@edu.hse.ru> Date: Wed, 26 Mar 2025 07:31:08 +0300 Subject: [PATCH] FINALLY MADE BonusBuilder --- assets/Font Over.otf | Bin 0 -> 17164 bytes assets/Oxygene1_RUS_by_KanycTa.ttf | Bin 0 -> 27288 bytes include/Builder/Builders/CommonBuilder.h | 3 +- include/Config.h | 2 +- include/Draw/Menu.h | 2 +- include/MazeContent/Buildings/Teleport.h | 10 +- source/Builder/Builders/BonusBuilder.cpp | 94 +++++++++++++++++- source/Builder/Builders/ComplexBuilder.cpp | 24 +++++ source/Builder/Builders/SimpleBuilder.cpp | 8 ++ source/Draw/Menu.cpp | 21 ++-- source/MazeContent/Buildings/Room.cpp | 2 +- source/MazeContent/Buildings/Teleport.cpp | 63 ++++++++---- .../Entities/DynamicEntities/Enemy.cpp | 14 +-- 13 files changed, 199 insertions(+), 44 deletions(-) create mode 100644 assets/Font Over.otf create mode 100644 assets/Oxygene1_RUS_by_KanycTa.ttf diff --git a/assets/Font Over.otf b/assets/Font Over.otf new file mode 100644 index 0000000000000000000000000000000000000000..aa9b9cc7d24afbb46fe2ff30089cea78840ab065 GIT binary patch literal 17164 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 U;P<t*E$?-~vob*9Guu}F8?tY6OaK4? literal 0 HcmV?d00001 diff --git a/assets/Oxygene1_RUS_by_KanycTa.ttf b/assets/Oxygene1_RUS_by_KanycTa.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1d8a194789aaa97dc2be1a5ed2930b307106b055 GIT binary patch literal 27288 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 V$l3bCU72$){^y;%vf}?P{VyQcW;Fl+ literal 0 HcmV?d00001 diff --git a/include/Builder/Builders/CommonBuilder.h b/include/Builder/Builders/CommonBuilder.h index c758782..b025eb1 100644 --- a/include/Builder/Builders/CommonBuilder.h +++ b/include/Builder/Builders/CommonBuilder.h @@ -14,11 +14,12 @@ public: public: CommonBuilder(float width, float height, float room_size); virtual ~CommonBuilder() = default; +public: + std::vector<std::vector<std::unique_ptr<Room>>> m_rooms; protected: float m_width; float m_height; float m_room_size; - std::vector<std::vector<std::unique_ptr<Room>>> m_rooms; private: GameContext m_context; std::unique_ptr<GameState> m_game_state; diff --git a/include/Config.h b/include/Config.h index bd3c608..96080fd 100644 --- a/include/Config.h +++ b/include/Config.h @@ -27,7 +27,7 @@ namespace config { const char EASY_GAME_TITLE[] = "Level: Easy"; const char MEDIUM_GAME_TITLE[] = "Level: Medium"; const char HARD_GAME_TITLE[] = "Level: Hard"; - const char BONUS_GAME_TITLE[] = "Level: Hard"; + const char BONUS_GAME_TITLE[] = "Level: Bonus"; const float EASY_GAME_ENEMY_RATIO = 0.0f; const float MEDIUM_GAME_ENEMY_RATIO = 0.03f; const float HARD_GAME_ENEMY_RATIO = 0.05f; diff --git a/include/Draw/Menu.h b/include/Draw/Menu.h index 82971d6..0315f4e 100644 --- a/include/Draw/Menu.h +++ b/include/Draw/Menu.h @@ -10,5 +10,5 @@ public: public: Menu(IStateManager& state_manager); private: - std::array<Button, 4> m_buttons; + std::array<Button, 5> m_buttons; }; \ No newline at end of file diff --git a/include/MazeContent/Buildings/Teleport.h b/include/MazeContent/Buildings/Teleport.h index fda435f..b9f0486 100644 --- a/include/MazeContent/Buildings/Teleport.h +++ b/include/MazeContent/Buildings/Teleport.h @@ -2,14 +2,20 @@ #include "MazeContent/Buildings/Room.h" +#include <functional> + class Teleport : public IRoomSide { public: void enter(IEntity* entity) override; void prepare_for_drawing() override; void draw_into(sf::RenderWindow& window) const override; public: - Teleport(std::vector<std::unique_ptr<Room>> rooms) : m_rooms(std::move(rooms)) {} + Teleport(Room &room1, Room &room2, Room &room3, Room &room4, + Room &room5, Room &room6, Room &room7, Room &room8); private: - std::vector<std::unique_ptr<Room>> m_rooms; + std::vector<std::reference_wrapper<Room>> m_rooms; + + // std::vector<std::unique_ptr<Room>> m_rooms; +// std::vector<Room&> m_rooms; std::vector<std::array<sf::Vertex, 2>> lines; }; \ No newline at end of file diff --git a/source/Builder/Builders/BonusBuilder.cpp b/source/Builder/Builders/BonusBuilder.cpp index 9babd34..f944987 100644 --- a/source/Builder/Builders/BonusBuilder.cpp +++ b/source/Builder/Builders/BonusBuilder.cpp @@ -3,7 +3,7 @@ #include "MazeContent/Buildings/Pass.h" #include "MazeContent/Buildings/Teleport.h" -#include "iostream" +#include "iostream" ///@todo убрать BonusBuider::BonusBuider(float width, float height, float room_size): CommonBuilder(width, height, room_size) {} @@ -20,7 +20,6 @@ void BonusBuider::create_rooms() { for (size_t i = 0; i < rows; ++i) { std::vector<std::unique_ptr<Room>> row; for (size_t j = 0; j < cols; ++j) { -// auto room = std::make_unique<Room>(m_room_size); if (i % 2 == 1 || j % 2 == 1) { auto room = std::make_unique<Room>(m_room_size); room->set_position(sf::Vector2f{ top_left_origin_pos.x + j * m_room_size, @@ -32,62 +31,153 @@ void BonusBuider::create_rooms() { } } +static const std::vector<std::pair<int, int>> excluded_rooms_l_r = { + {0, 2}, {0, 7}, {12, 2}, {12, 7} +}; + +static const std::vector<std::pair<int, int>> excluded_rooms_u_d = { + {6, 0}, {6, 4}, {6, 5}, {6, 9} +}; + +static bool is_excluded(int i, int j) { + for (const auto& excluded : excluded_rooms_l_r) { + if (excluded.first == i && excluded.second == j) + return true; + } + for (const auto& excluded : excluded_rooms_u_d) { + if (excluded.first == i && excluded.second == j) + return true; + } + return false; +} + +static void set_rooms_teleport(BonusBuider& BD, std::shared_ptr<Teleport> teleport) { + for (const auto &excluded: excluded_rooms_l_r) { + size_t i = excluded.first; + size_t j = excluded.second; + auto left_wall_1 = std::make_shared<Wall>(*(BD.m_rooms[i][j])); + auto right_wall_1 = std::make_shared<Wall>(*(BD.m_rooms[i][j])); + BD.m_rooms[i][j]->set_side(Room::LEFT, left_wall_1); + BD.m_rooms[i][j]->set_side(Room::RIGHT, right_wall_1); + if (i == 0) { + BD.m_rooms[i][j]->set_side(Room::UP, teleport); + auto my_down_pass = std::make_shared<Pass>(*(BD.m_rooms[i][j]), *(BD.m_rooms[i + 1][2 * j + 1])); + auto neighbour_down_pass = std::make_shared<Pass>(*(BD.m_rooms[i + 1][2 * j + 1]), *(BD.m_rooms[i + 2][j])); + BD.m_rooms[i][j]->set_side(Room::DOWN, my_down_pass); + BD.m_rooms[i + 1][2 * j + 1]->set_side(Room::UP, my_down_pass); + BD.m_rooms[i + 1][2 * j + 1]->set_side(Room::DOWN, neighbour_down_pass); + BD.m_rooms[i + 2][j]->set_side(Room::UP, neighbour_down_pass); + } else if (i == 12) { + BD.m_rooms[i][j]->set_side(Room::DOWN, teleport); + auto my_up_pass = std::make_shared<Pass>(*(BD.m_rooms[i][j]), *(BD.m_rooms[i - 1][2 * j + 1])); + auto neighbour_up_pass = std::make_shared<Pass>(*(BD.m_rooms[i - 1][2 * j + 1]), *(BD.m_rooms[i - 2][j])); + BD.m_rooms[i][j]->set_side(Room::UP, my_up_pass); + BD.m_rooms[i - 1][2 * j + 1]->set_side(Room::DOWN, my_up_pass); + BD.m_rooms[i - 1][2 * j + 1]->set_side(Room::UP, neighbour_up_pass); + BD.m_rooms[i - 2][j]->set_side(Room::DOWN, neighbour_up_pass); + } + } + for (const auto &excluded: excluded_rooms_u_d) { + size_t i = excluded.first; + size_t j = excluded.second; + if (j == 0 || j == 5) { + BD.m_rooms[i][j]->set_side(Room::LEFT, teleport); + auto right_wall = std::make_shared<Wall>(*(BD.m_rooms[i][j])); + BD.m_rooms[i][j]->set_side(Room::RIGHT, right_wall); + } if (j == 4 || j == 9) { + BD.m_rooms[i][j]->set_side(Room::RIGHT, teleport); + auto left_wall = std::make_shared<Wall>(*(BD.m_rooms[i][j])); + BD.m_rooms[i][j]->set_side(Room::LEFT, left_wall); + } + } + BD.m_rooms[0][2]->get_side(Room::UP)->prepare_for_drawing(); +} + void BonusBuider::set_rooms_sides() { + auto teleport = std::make_shared<Teleport>(*m_rooms[0][2], *m_rooms[0][7], *m_rooms[6][0], *m_rooms[6][4], + *m_rooms[6][5], *m_rooms[6][9], *m_rooms[12][2], *m_rooms[12][7]); + set_rooms_teleport(*this, teleport); for (size_t i = 0; i < m_rooms.size(); ++i) { for (size_t j = 0; j < m_rooms.at(i).size(); ++j) { + if (is_excluded(i, j)) + continue; if (i % 2 == 0) { auto left_wall_1 = std::make_shared<Wall>(*m_rooms[i][j]); auto right_wall_1 = std::make_shared<Wall>(*m_rooms[i][j]); m_rooms[i][j]->set_side(Room::LEFT, left_wall_1); + m_rooms[i][j]->get_side(Room::LEFT)->prepare_for_drawing(); m_rooms[i][j]->set_side(Room::RIGHT, right_wall_1); + m_rooms[i][j]->get_side(Room::RIGHT)->prepare_for_drawing(); if (i == 0) { auto up_wall_1 = std::make_shared<Wall>(*m_rooms[i][j]); auto my_down_pass = std::make_shared<Pass>(*m_rooms[i][j], *m_rooms[i + 1][2 * j + 1]); auto neighbour_down_pass = std::make_shared<Pass>(*m_rooms[i + 1][2 * j + 1], *m_rooms[i + 2][j]); m_rooms[i][j]->set_side(Room::UP, up_wall_1); + m_rooms[i][j]->get_side(Room::UP)->prepare_for_drawing(); m_rooms[i][j]->set_side(Room::DOWN, my_down_pass); + m_rooms[i][j]->get_side(Room::DOWN)->prepare_for_drawing(); m_rooms[i + 1][2 * j + 1]->set_side(Room::UP, my_down_pass); + m_rooms[i + 1][2 * j + 1]->get_side(Room::UP)->prepare_for_drawing(); m_rooms[i + 1][2 * j + 1]->set_side(Room::DOWN, neighbour_down_pass); + m_rooms[i + 1][2 * j + 1]->get_side(Room::DOWN)->prepare_for_drawing(); m_rooms[i + 2][j]->set_side(Room::UP, neighbour_down_pass); + m_rooms[i + 2][j]->get_side(Room::UP)->prepare_for_drawing(); } else if (i == m_rooms.size() - 1) { auto down_wall_1 = std::make_shared<Wall>(*m_rooms[i][j]); auto my_up_pass = std::make_shared<Pass>(*m_rooms[i][j], *m_rooms[i - 1][2 * j + 1]); auto neighbour_up_pass = std::make_shared<Pass>(*m_rooms[i - 1][2 * j + 1], *m_rooms[i - 2][j]); m_rooms[i][j]->set_side(Room::DOWN, down_wall_1); + m_rooms[i][j]->get_side(Room::DOWN)->prepare_for_drawing(); m_rooms[i][j]->set_side(Room::UP, my_up_pass); + m_rooms[i][j]->get_side(Room::UP)->prepare_for_drawing(); m_rooms[i - 1][2 * j + 1]->set_side(Room::DOWN, my_up_pass); + m_rooms[i - 1][2 * j + 1]->get_side(Room::DOWN)->prepare_for_drawing(); m_rooms[i - 1][2 * j + 1]->set_side(Room::UP, neighbour_up_pass); + m_rooms[i - 1][2 * j + 1]->get_side(Room::UP)->prepare_for_drawing(); m_rooms[i - 2][j]->set_side(Room::DOWN, neighbour_up_pass); + m_rooms[i - 2][j]->get_side(Room::DOWN)->prepare_for_drawing(); } } else if (j % 2 == 0) { auto up_wall_2 = std::make_shared<Wall>(*m_rooms[i][j]); auto down_wall_2 = std::make_shared<Wall>(*m_rooms[i][j]); m_rooms[i][j]->set_side(Room::UP, up_wall_2); + m_rooms[i][j]->get_side(Room::UP)->prepare_for_drawing(); m_rooms[i][j]->set_side(Room::DOWN, down_wall_2); + m_rooms[i][j]->get_side(Room::DOWN)->prepare_for_drawing(); if (j == 0) { auto left_wall_2 = std::make_shared<Wall>(*m_rooms[i][j]); m_rooms[i][j]->set_side(Room::LEFT, left_wall_2); + m_rooms[i][j]->get_side(Room::LEFT)->prepare_for_drawing(); } else if (j == m_rooms.at(i).size() - 1) { auto right_wall_2 = std::make_shared<Wall>(*m_rooms[i][j]); m_rooms[i][j]->set_side(Room::RIGHT, right_wall_2); + m_rooms[i][j]->get_side(Room::RIGHT)->prepare_for_drawing(); } } else if (j % 2 == 1) { auto left_pass = std::make_shared<Pass>(*m_rooms[i][j], *m_rooms[i][j - 1]); auto right_pass = std::make_shared<Pass>(*m_rooms[i][j], *m_rooms[i][j + 1]); m_rooms[i][j]->set_side(Room::LEFT, left_pass); + m_rooms[i][j]->get_side(Room::LEFT)->prepare_for_drawing(); m_rooms[i][j - 1]->set_side(Room::RIGHT, left_pass); + m_rooms[i][j - 1]->get_side(Room::RIGHT)->prepare_for_drawing(); m_rooms[i][j]->set_side(Room::RIGHT, right_pass); + m_rooms[i][j]->get_side(Room::RIGHT)->prepare_for_drawing(); m_rooms[i][j + 1]->set_side(Room::LEFT, right_pass); + m_rooms[i][j + 1]->get_side(Room::LEFT)->prepare_for_drawing(); if (!(i == 1 || i == m_rooms.size() - 2)) { auto up_pass = std::make_shared<Pass>(*m_rooms[i][j], *m_rooms[i - 1][(j -1) / 2]); auto down_pass = std::make_shared<Pass>(*m_rooms[i][j], *m_rooms[i + 1][(j -1) / 2]); m_rooms[i][j]->set_side(Room::UP, up_pass); + m_rooms[i][j]->get_side(Room::UP)->prepare_for_drawing(); m_rooms[i - 1][(j -1) / 2]->set_side(Room::DOWN, up_pass); + m_rooms[i - 1][(j -1) / 2]->get_side(Room::DOWN)->prepare_for_drawing(); m_rooms[i][j]->set_side(Room::DOWN, down_pass); + m_rooms[i][j]->get_side(Room::DOWN)->prepare_for_drawing(); m_rooms[i + 1][(j -1) / 2]->set_side(Room::UP, down_pass); + m_rooms[i + 1][(j -1) / 2]->get_side(Room::UP)->prepare_for_drawing(); } } } diff --git a/source/Builder/Builders/ComplexBuilder.cpp b/source/Builder/Builders/ComplexBuilder.cpp index 0ab9c3f..e78dbec 100644 --- a/source/Builder/Builders/ComplexBuilder.cpp +++ b/source/Builder/Builders/ComplexBuilder.cpp @@ -38,55 +38,79 @@ void ComplexBuilder::set_rooms_sides() { auto left_wall_1 = std::make_shared<Wall>(*m_rooms[i][j]); auto right_wall_1 = std::make_shared<Wall>(*m_rooms[i][j]); m_rooms[i][j]->set_side(Room::LEFT, left_wall_1); + m_rooms[i][j]->get_side(Room::LEFT)->prepare_for_drawing(); m_rooms[i][j]->set_side(Room::RIGHT, right_wall_1); + m_rooms[i][j]->get_side(Room::RIGHT)->prepare_for_drawing(); if (i == 0) { auto up_wall_1 = std::make_shared<Wall>(*m_rooms[i][j]); auto my_down_pass = std::make_shared<Pass>(*m_rooms[i][j], *m_rooms[i + 1][2 * j + 1]); auto neighbour_down_pass = std::make_shared<Pass>(*m_rooms[i + 1][2 * j + 1], *m_rooms[i + 2][j]); m_rooms[i][j]->set_side(Room::UP, up_wall_1); + m_rooms[i][j]->get_side(Room::UP)->prepare_for_drawing(); m_rooms[i][j]->set_side(Room::DOWN, my_down_pass); + m_rooms[i][j]->get_side(Room::DOWN)->prepare_for_drawing(); m_rooms[i + 1][2 * j + 1]->set_side(Room::UP, my_down_pass); + m_rooms[i + 1][2 * j + 1]->get_side(Room::UP)->prepare_for_drawing(); m_rooms[i + 1][2 * j + 1]->set_side(Room::DOWN, neighbour_down_pass); + m_rooms[i + 1][2 * j + 1]->get_side(Room::DOWN)->prepare_for_drawing(); m_rooms[i + 2][j]->set_side(Room::UP, neighbour_down_pass); + m_rooms[i + 2][j]->get_side(Room::UP)->prepare_for_drawing(); } else if (i == m_rooms.size() - 1) { auto down_wall_1 = std::make_shared<Wall>(*m_rooms[i][j]); auto my_up_pass = std::make_shared<Pass>(*m_rooms[i][j], *m_rooms[i - 1][2 * j + 1]); auto neighbour_up_pass = std::make_shared<Pass>(*m_rooms[i - 1][2 * j + 1], *m_rooms[i - 2][j]); m_rooms[i][j]->set_side(Room::DOWN, down_wall_1); + m_rooms[i][j]->get_side(Room::DOWN)->prepare_for_drawing(); m_rooms[i][j]->set_side(Room::UP, my_up_pass); + m_rooms[i][j]->get_side(Room::UP)->prepare_for_drawing(); m_rooms[i - 1][2 * j + 1]->set_side(Room::DOWN, my_up_pass); + m_rooms[i - 1][2 * j + 1]->get_side(Room::DOWN)->prepare_for_drawing(); m_rooms[i - 1][2 * j + 1]->set_side(Room::UP, neighbour_up_pass); + m_rooms[i - 1][2 * j + 1]->get_side(Room::UP)->prepare_for_drawing(); m_rooms[i - 2][j]->set_side(Room::DOWN, neighbour_up_pass); + m_rooms[i - 2][j]->get_side(Room::DOWN)->prepare_for_drawing(); } } else if (j % 2 == 0) { auto up_wall_2 = std::make_shared<Wall>(*m_rooms[i][j]); auto down_wall_2 = std::make_shared<Wall>(*m_rooms[i][j]); m_rooms[i][j]->set_side(Room::UP, up_wall_2); + m_rooms[i][j]->get_side(Room::UP)->prepare_for_drawing(); m_rooms[i][j]->set_side(Room::DOWN, down_wall_2); + m_rooms[i][j]->get_side(Room::DOWN)->prepare_for_drawing(); if (j == 0) { auto left_wall_2 = std::make_shared<Wall>(*m_rooms[i][j]); m_rooms[i][j]->set_side(Room::LEFT, left_wall_2); + m_rooms[i][j]->get_side(Room::LEFT)->prepare_for_drawing(); } else if (j == m_rooms.at(i).size() - 1) { auto right_wall_2 = std::make_shared<Wall>(*m_rooms[i][j]); m_rooms[i][j]->set_side(Room::RIGHT, right_wall_2); + m_rooms[i][j]->get_side(Room::RIGHT)->prepare_for_drawing(); } } else if (j % 2 == 1) { auto left_pass = std::make_shared<Pass>(*m_rooms[i][j], *m_rooms[i][j - 1]); auto right_pass = std::make_shared<Pass>(*m_rooms[i][j], *m_rooms[i][j + 1]); m_rooms[i][j]->set_side(Room::LEFT, left_pass); + m_rooms[i][j]->get_side(Room::LEFT)->prepare_for_drawing(); m_rooms[i][j - 1]->set_side(Room::RIGHT, left_pass); + m_rooms[i][j - 1]->get_side(Room::RIGHT)->prepare_for_drawing(); m_rooms[i][j]->set_side(Room::RIGHT, right_pass); + m_rooms[i][j]->get_side(Room::RIGHT)->prepare_for_drawing(); m_rooms[i][j + 1]->set_side(Room::LEFT, right_pass); + m_rooms[i][j + 1]->get_side(Room::LEFT)->prepare_for_drawing(); if (!(i == 1 || i == m_rooms.size() - 2)) { auto up_pass = std::make_shared<Pass>(*m_rooms[i][j], *m_rooms[i - 1][(j -1) / 2]); auto down_pass = std::make_shared<Pass>(*m_rooms[i][j], *m_rooms[i + 1][(j -1) / 2]); m_rooms[i][j]->set_side(Room::UP, up_pass); + m_rooms[i][j]->get_side(Room::UP)->prepare_for_drawing(); m_rooms[i - 1][(j -1) / 2]->set_side(Room::DOWN, up_pass); + m_rooms[i - 1][(j -1) / 2]->get_side(Room::DOWN)->prepare_for_drawing(); m_rooms[i][j]->set_side(Room::DOWN, down_pass); + m_rooms[i][j]->get_side(Room::DOWN)->prepare_for_drawing(); m_rooms[i + 1][(j -1) / 2]->set_side(Room::UP, down_pass); + m_rooms[i + 1][(j -1) / 2]->get_side(Room::UP)->prepare_for_drawing(); } } } diff --git a/source/Builder/Builders/SimpleBuilder.cpp b/source/Builder/Builders/SimpleBuilder.cpp index f97b42e..432229b 100644 --- a/source/Builder/Builders/SimpleBuilder.cpp +++ b/source/Builder/Builders/SimpleBuilder.cpp @@ -28,26 +28,34 @@ void SimpleBuilder::set_rooms_sides() { if (i == 0) { auto up_wall = std::make_shared<Wall>(*m_rooms[i][j]); m_rooms[i][j]->set_side(Room::UP, up_wall); + m_rooms[i][j]->get_side(Room::UP)->prepare_for_drawing(); } else { auto pass = std::make_shared<Pass>(*m_rooms[i - 1][j], *m_rooms[i][j]); m_rooms[i - 1][j]->set_side(Room::DOWN, pass); + m_rooms[i - 1][j]->get_side(Room::DOWN)->prepare_for_drawing(); m_rooms[i][j]->set_side(Room::UP, pass); + m_rooms[i][j]->get_side(Room::UP)->prepare_for_drawing(); } if (j == 0) { auto left_wall = std::make_shared<Wall>(*m_rooms[i][j]); m_rooms[i][j]->set_side(Room::LEFT, left_wall); + m_rooms[i][j]->get_side(Room::LEFT)->prepare_for_drawing(); } else { auto pass = std::make_shared<Pass>(*m_rooms[i][j - 1], *m_rooms[i][j]); m_rooms[i][j - 1]->set_side(Room::RIGHT, pass); + m_rooms[i][j - 1]->get_side(Room::RIGHT)->prepare_for_drawing(); m_rooms[i][j]->set_side(Room::LEFT, pass); + m_rooms[i][j]->get_side(Room::LEFT)->prepare_for_drawing(); } if (i == m_rooms.size() - 1) { auto down_wall = std::make_shared<Wall>(*m_rooms[i][j]); m_rooms[i][j]->set_side(Room::DOWN, down_wall); + m_rooms[i][j]->get_side(Room::DOWN)->prepare_for_drawing(); } if (j == m_rooms.begin()->size() - 1) { auto right_wall = std::make_shared<Wall>(*m_rooms[i][j]); m_rooms[i][j]->set_side(Room::RIGHT, right_wall); + m_rooms[i][j]->get_side(Room::RIGHT)->prepare_for_drawing(); } } } diff --git a/source/Draw/Menu.cpp b/source/Draw/Menu.cpp index aa796b0..024d7a4 100644 --- a/source/Draw/Menu.cpp +++ b/source/Draw/Menu.cpp @@ -1,13 +1,14 @@ #include "Draw/Menu.h" #include "Builder/Builders/SimpleBuilder.h" #include "Builder/Builders/ComplexBuilder.h" +#include "Builder/Builders/BonusBuilder.h" #include "Commands/GameCommand.h" #include "Commands/ExitCommand.h" Menu::Menu(IStateManager& state_manager) { sf::Vector2f starting_position(config::SELECT_LEVEL_VIDEO_MODE.width / 2.f, - config::SELECT_LEVEL_VIDEO_MODE.height / 5.f); + config::SELECT_LEVEL_VIDEO_MODE.height / 6.f); auto easy_director = std::make_unique<GameBuilderDirector>( std::make_unique<SimpleBuilder>( @@ -33,22 +34,24 @@ Menu::Menu(IStateManager& state_manager) { config::HARD_GAME_TITLE, config::HARD_GAME_ENEMY_RATIO); -// auto bonus_director = std::make_unique<GameBuilderDirector>( -// std::make_unique<ComplexBuilder>( -// config::GAME_VIDEO_MODE.width, config::GAME_VIDEO_MODE.height, -// config::ROOM_SIZE), -// config::GAME_VIDEO_MODE, -// config::HARD_GAME_TITLE, -// config::HARD_GAME_ENEMY_RATIO); + auto bonus_director = std::make_unique<GameBuilderDirector>( + std::make_unique<BonusBuider>( + config::GAME_VIDEO_MODE.width, config::GAME_VIDEO_MODE.height, + config::ROOM_SIZE), + config::GAME_VIDEO_MODE, + config::BONUS_GAME_TITLE, + config::HARD_GAME_ENEMY_RATIO); auto easy_command = std::make_unique<GameCommand>(state_manager, std::move(easy_director)); auto medium_command = std::make_unique<GameCommand>(state_manager, std::move(medium_director)); auto hard_command = std::make_unique<GameCommand>(state_manager, std::move(hard_director)); + auto bonus_command = std::make_unique<GameCommand>(state_manager, std::move(bonus_director)); auto exit_command = std::make_unique<ExitCommand>(state_manager); m_buttons[0].set(sf::Vector2f{ starting_position.x, starting_position.y}, config::BUTTON_SIZE, config::BUTTON_TEXT_EASY, config::BUTTON_FONT_SIZE, std::move(easy_command)); m_buttons[1].set(sf::Vector2f{ starting_position.x, 2*starting_position.y}, config::BUTTON_SIZE, config::BUTTON_TEXT_MEDIUM, config::BUTTON_FONT_SIZE, std::move(medium_command)); m_buttons[2].set(sf::Vector2f{ starting_position.x, 3*starting_position.y}, config::BUTTON_SIZE, config::BUTTON_TEXT_HARD, config::BUTTON_FONT_SIZE, std::move(hard_command)); - m_buttons[3].set(sf::Vector2f{ starting_position.x, 4*starting_position.y}, config::BUTTON_SIZE, config::BUTTON_TEXT_EXIT, config::BUTTON_FONT_SIZE, std::move(exit_command)); + m_buttons[3].set(sf::Vector2f{ starting_position.x, 4*starting_position.y}, config::BUTTON_SIZE, config::BUTTON_TEXT_BONUS, config::BUTTON_FONT_SIZE, std::move(bonus_command)); + m_buttons[4].set(sf::Vector2f{ starting_position.x, 5*starting_position.y}, config::BUTTON_SIZE, config::BUTTON_TEXT_EXIT, config::BUTTON_FONT_SIZE, std::move(exit_command)); } void Menu::draw_into(sf::RenderWindow& window) const { diff --git a/source/MazeContent/Buildings/Room.cpp b/source/MazeContent/Buildings/Room.cpp index 3bbea9c..6d1fb6c 100644 --- a/source/MazeContent/Buildings/Room.cpp +++ b/source/MazeContent/Buildings/Room.cpp @@ -30,7 +30,7 @@ void Room::set_side(Direction side, std::shared_ptr<IRoomSide> ptr_side) noexcep if (side == INVALID) return; m_sides.at(side) = std::move(ptr_side); - m_sides.at(side)->prepare_for_drawing(); +// m_sides.at(side)->prepare_for_drawing(); ///@todo еÑли что убрать } std::shared_ptr<IRoomSide> Room::get_side(Direction side) { diff --git a/source/MazeContent/Buildings/Teleport.cpp b/source/MazeContent/Buildings/Teleport.cpp index ea43ccf..b4ca195 100644 --- a/source/MazeContent/Buildings/Teleport.cpp +++ b/source/MazeContent/Buildings/Teleport.cpp @@ -2,17 +2,40 @@ #include "MazeContent/Entities/IEntity.h" #include "Config.h" +#include "iostream" + +Teleport::Teleport(Room& room1, Room& room2, Room& room3, Room& room4, + Room& room5, Room& room6, Room& room7,Room& room8) { + m_rooms.emplace_back(std::ref(room1)); + m_rooms.emplace_back(std::ref(room2)); + m_rooms.emplace_back(std::ref(room3)); + m_rooms.emplace_back(std::ref(room4)); + m_rooms.emplace_back(std::ref(room5)); + m_rooms.emplace_back(std::ref(room6)); + m_rooms.emplace_back(std::ref(room7)); + m_rooms.emplace_back(std::ref(room8)); + + ///@todo убрать + for (int i = 0; i < 8; i++) + std::cout << i << ' ' << m_rooms.at(i).get().get_position().x << ' ' << m_rooms.at(i).get().get_position().y << ' ' << m_rooms.at(i).get().get_direction(this) <<'\n'; + +} + void Teleport::prepare_for_drawing() { for (size_t i = 0; i < m_rooms.size(); ++i) { - sf::Vector2f pos = m_rooms.at(i)->get_position(); + sf::Vector2f pos = m_rooms.at(i).get().get_position(); + + ///@todo убрать +// std::cout << i << ' ' << m_rooms.at(i).get().get_position().x << ' ' << m_rooms.at(i).get().get_position().y << ' ' << m_rooms.at(i).get().get_direction(this) <<'\n'; + - switch (m_rooms.at(i)->get_direction(this)) { + switch (m_rooms.at(i).get().get_direction(this)) { case Room::LEFT: lines.emplace_back(std::array<sf::Vertex, 2>{ - sf::Vertex{sf::Vector2f(pos.x - m_rooms.at(i)->get_size() / 2, - pos.y - m_rooms.at(i)->get_size() / 2), config::GAME_COLOR_TELEPORT}, - sf::Vertex{sf::Vector2f(pos.x - m_rooms.at(i)->get_size() / 2, - pos.y + m_rooms.at(i)->get_size() / 2), config::GAME_COLOR_TELEPORT} + sf::Vertex{sf::Vector2f(pos.x - m_rooms.at(i).get().get_size() / 2, + pos.y - m_rooms.at(i).get().get_size() / 2), config::GAME_COLOR_TELEPORT}, + sf::Vertex{sf::Vector2f(pos.x - m_rooms.at(i).get().get_size() / 2, + pos.y + m_rooms.at(i).get().get_size() / 2), config::GAME_COLOR_TELEPORT} }); // // m_line[0] = sf::Vertex{sf::Vector2f(pos.x - m_rooms.at(i)->get_size() / 2, @@ -23,10 +46,10 @@ void Teleport::prepare_for_drawing() { case Room::RIGHT: lines.emplace_back(std::array<sf::Vertex, 2>{ - sf::Vertex{sf::Vector2f(pos.x + m_rooms.at(i)->get_size() / 2, - pos.y - m_rooms.at(i)->get_size() / 2), config::GAME_COLOR_TELEPORT}, - sf::Vertex{sf::Vector2f(pos.x + m_rooms.at(i)->get_size() / 2, - pos.y + m_rooms.at(i)->get_size() / 2), config::GAME_COLOR_TELEPORT} + sf::Vertex{sf::Vector2f(pos.x + m_rooms.at(i).get().get_size() / 2, + pos.y - m_rooms.at(i).get().get_size() / 2), config::GAME_COLOR_TELEPORT}, + sf::Vertex{sf::Vector2f(pos.x + m_rooms.at(i).get().get_size() / 2, + pos.y + m_rooms.at(i).get().get_size() / 2), config::GAME_COLOR_TELEPORT} }); // m_line[0] = sf::Vertex{sf::Vector2f(pos.x + m_rooms.at(i)->get_size() / 2, // pos.y - m_rooms.at(i)->get_size() / 2), config::GAME_COLOR_TELEPORT}; @@ -36,10 +59,10 @@ void Teleport::prepare_for_drawing() { case Room::UP: lines.emplace_back(std::array<sf::Vertex, 2>{ - sf::Vertex{sf::Vector2f(pos.x - m_rooms.at(i)->get_size() / 2, - pos.y - m_rooms.at(i)->get_size() / 2), config::GAME_COLOR_TELEPORT}, - sf::Vertex{sf::Vector2f(pos.x + m_rooms.at(i)->get_size() / 2, - pos.y - m_rooms.at(i)->get_size() / 2), config::GAME_COLOR_TELEPORT} + sf::Vertex{sf::Vector2f(pos.x - m_rooms.at(i).get().get_size() / 2, + pos.y - m_rooms.at(i).get().get_size() / 2), config::GAME_COLOR_TELEPORT}, + sf::Vertex{sf::Vector2f(pos.x + m_rooms.at(i).get().get_size() / 2, + pos.y - m_rooms.at(i).get().get_size() / 2), config::GAME_COLOR_TELEPORT} }); // m_line[0] = sf::Vertex{sf::Vector2f(pos.x - m_rooms.at(i)->get_size() / 2, @@ -50,10 +73,10 @@ void Teleport::prepare_for_drawing() { case Room::DOWN: lines.emplace_back(std::array<sf::Vertex, 2>{ - sf::Vertex{sf::Vector2f(pos.x - m_rooms.at(i)->get_size() / 2, - pos.y + m_rooms.at(i)->get_size() / 2), config::GAME_COLOR_TELEPORT}, - sf::Vertex{sf::Vector2f(pos.x + m_rooms.at(i)->get_size() / 2, - pos.y + m_rooms.at(i)->get_size() / 2), config::GAME_COLOR_TELEPORT} + sf::Vertex{sf::Vector2f(pos.x - m_rooms.at(i).get().get_size() / 2, + pos.y + m_rooms.at(i).get().get_size() / 2), config::GAME_COLOR_TELEPORT}, + sf::Vertex{sf::Vector2f(pos.x + m_rooms.at(i).get().get_size() / 2, + pos.y + m_rooms.at(i).get().get_size() / 2), config::GAME_COLOR_TELEPORT} }); // m_line[0] = sf::Vertex{sf::Vector2f(pos.x - m_rooms.at(i)->get_size() / 2, @@ -71,8 +94,8 @@ void Teleport::prepare_for_drawing() { void Teleport::enter(IEntity* entity) { size_t number = m_rooms.size(); for (size_t i = 0; i < number; ++i) { - if (entity->get_location() == m_rooms.at(i).get()) - entity->set_location(m_rooms.at(rand() % number).get()); + if (entity->get_location() == &(m_rooms.at(i).get())) + entity->set_location(&(m_rooms.at(rand() % number).get())); } } diff --git a/source/MazeContent/Entities/DynamicEntities/Enemy.cpp b/source/MazeContent/Entities/DynamicEntities/Enemy.cpp index b4c21ff..112dfff 100644 --- a/source/MazeContent/Entities/DynamicEntities/Enemy.cpp +++ b/source/MazeContent/Entities/DynamicEntities/Enemy.cpp @@ -19,13 +19,13 @@ void Enemy::draw_into(sf::RenderWindow& window) const { window.draw(m_rectangle); } -void Enemy::action() { - auto miliseconds = static_cast<size_t>(m_stopwatch.getElapsedTime().asMilliseconds()); - if (miliseconds < rand() % 10000) - return; - auto direction = static_cast<Room::Direction>(rand() % 4); - m_ptr_room->get_side(direction)->enter(this); - m_stopwatch.restart(); +void Enemy::action() { ///@todo раÑкоментить +// auto miliseconds = static_cast<size_t>(m_stopwatch.getElapsedTime().asMilliseconds()); +// if (miliseconds < rand() % 10000) +// return; +// auto direction = static_cast<Room::Direction>(rand() % 4); +// m_ptr_room->get_side(direction)->enter(this); +// m_stopwatch.restart(); } std::unique_ptr<IGameEvent> Enemy::accept(IVisitor* ptr_visitor) { -- GitLab