diff --git a/source/application/BobBuilder/GameBuilders.cpp b/source/application/BobBuilder/GameBuilders.cpp index 02cbf052d8a5f8939e05a35e35221e11b1629236..72fa274ffa790b377d3d54a8042e94ff1566887c 100644 --- a/source/application/BobBuilder/GameBuilders.cpp +++ b/source/application/BobBuilder/GameBuilders.cpp @@ -16,7 +16,7 @@ void CommonBuilder::create_context(float static_objects_ratio, float dynamic_obj for (auto& row : m_rooms) for (auto& room : row) if (room != nullptr) - empty_rooms_buffer.emplace_back(room); + empty_rooms_buffer.emplace_back(room.get()); ///> в рандомное место располагаем пакмана float id = std::rand() % empty_rooms_buffer.size(); m_context.pacman.set_location(empty_rooms_buffer[id]); @@ -70,12 +70,11 @@ void CommonBuilder::create_state(IStateManager &state_manager, const sf::VideoMo * @brief Созданный лабиринт и контекст назначаем созданному состоянию игры GameState */ void CommonBuilder::set_all_to_state() { - std::vector<Room*> rooms; + std::vector<std::unique_ptr<Room>> rooms; for (auto& row : m_rooms) for (auto& col : row) - rooms.emplace_back(col); - Maze maze(rooms); - m_game_state->set_maze(std::move(maze)); ///> назначаем лабиринт + rooms.emplace_back(std::move(col)); + m_game_state->set_maze(Maze(rooms)); ///> назначаем лабиринт m_game_state->set_context(std::move(m_context)); } @@ -99,11 +98,11 @@ void SimpleBuilder::create_rooms() { int room_size = static_cast<int>(m_room_size); sf::Vector2f left_pos = sf::Vector2f{ config::MENU_WIDTH, (m_height - m_room_size * rows + m_room_size)/2}; for (int row = 0; row < rows * room_size; row += room_size) { - std::vector<Room*> row_vec; + std::vector<std::unique_ptr<Room>> row_vec; for (size_t col = 0; col < cols * room_size; col += room_size) { - Room* room = new Room(m_room_size); + std::unique_ptr<Room> room = std::make_unique<Room>(m_room_size); room->set_position({config::MENU_WIDTH + col, row + left_pos.y}); - row_vec.emplace_back(room); + row_vec.emplace_back(std::move(room)); } m_rooms.emplace_back(std::move(row_vec)); } @@ -144,9 +143,9 @@ void ComplexBuilder::create_rooms() { auto starting_point = sf::Vector2f{config::MENU_WIDTH, (m_height - m_room_size*room_quantity_row)/2 + + m_room_size/2}; for (int row = 0; row < room_quantity_row * room_size; row += room_size) { - std::vector<Room*> vector_row; + std::vector<std::unique_ptr<Room>> vector_row; for (int col = 0; col < room_quantity_col * room_size; col += room_size) { - auto room = new Room(m_room_size); + auto room = std::make_unique<Room>(m_room_size); room->set_position(sf::Vector2f {(col + starting_point.x), (row + starting_point.y)}); vector_row.emplace_back(std::move(room)); } diff --git a/source/application/BobBuilder/GameBuilders.h b/source/application/BobBuilder/GameBuilders.h index f14164be34a79df92ad921b8cb5ab5fe11428ef6..c1708c2106f2acdd029bff7587d65fbba01e5285 100644 --- a/source/application/BobBuilder/GameBuilders.h +++ b/source/application/BobBuilder/GameBuilders.h @@ -19,7 +19,7 @@ protected: float m_width; float m_height; float m_room_size; - std::vector<std::vector<Room*>> m_rooms; + std::vector<std::vector<std::unique_ptr<Room>>> m_rooms; GameContext m_context; std::unique_ptr<GameState> m_game_state; }; diff --git a/source/application/Drawable/Entity/Pacman.h b/source/application/Drawable/Entity/Pacman.h index e01c0cfc92cbddd700a03c19bd70fe8d176c2e55..446f726d1f38208dfe8c5b8665f04eb3e861f541 100644 --- a/source/application/Drawable/Entity/Pacman.h +++ b/source/application/Drawable/Entity/Pacman.h @@ -16,6 +16,8 @@ public: void move(Room::Direction direction); void prepare_for_drawing() override; void set_lives() { m_lives = 3;} + bool is_active() { return is_second;} + void set_active() { is_second = true;} void draw_into(sf::RenderWindow& window) override; std::unique_ptr<IGameEvent> visit(Food* ptr_entity) override; std::unique_ptr<IGameEvent> visit(Enemy* ptr_entity) override; @@ -30,4 +32,5 @@ private: sf::Sound m_sound; MyTexture* m_ptr_texture; bool m_second_player = false; + bool is_second = false; }; diff --git a/source/application/Drawable/Maze/Maze.h b/source/application/Drawable/Maze/Maze.h index e833b0243cbdd434bacba40843f54645925b9770..bb2faa71b7b29b1c751626b9967926e100584c31 100644 --- a/source/application/Drawable/Maze/Maze.h +++ b/source/application/Drawable/Maze/Maze.h @@ -30,10 +30,10 @@ public: class Maze: public IDrawable { public: Maze() = default; - explicit Maze(std::vector<Room*>& rooms) : m_rooms(rooms) {}; + explicit Maze(std::vector<std::unique_ptr<Room>>& rooms) : m_rooms(std::move(rooms)) {}; void draw_into(sf::RenderWindow& m_window) override; private: - std::vector<Room*> m_rooms; + std::vector<std::unique_ptr<Room>> m_rooms; }; ///стена, которая хранит в себе информацию о том в какой комнате находится diff --git a/source/application/Event/IGameEvent.cpp b/source/application/Event/IGameEvent.cpp index 90c2073e8a73f9d1164f5eba3e782ba35a6f9009..88181e53e77e282a569ce3fa08ed89f0cee9ba09 100644 --- a/source/application/Event/IGameEvent.cpp +++ b/source/application/Event/IGameEvent.cpp @@ -44,7 +44,7 @@ void PacmanLoseLifeEvent::handle(GameContext *context) { pacman_lose_life.lose_life(); if (pacman_lose_life.died()) { - if (context->pacman.died() && !m_second_player && context->pacman2.get_lives() == 3) + if (context->pacman.died() && !context->pacman2.is_active()) context->state = GameContext::LOST; if (context->pacman.died() && context->pacman2.died()) context->state = GameContext::LOST; @@ -69,6 +69,6 @@ SwampEvent::SwampEvent(Room* swamp_location) : m_swamp_location(swamp_location) void SwampEvent::handle(GameContext* context) { if (context->pacman.get_lives() > 0) context->pacman.set_lives(); - if (context->pacman2.get_lives()) + if (context->pacman2.get_lives() > 0) context->pacman2.set_lives(); } diff --git a/source/application/State/GameState.cpp b/source/application/State/GameState.cpp index 2dd5d4b31dff07351fa9ba201e17c00b8927424f..703ffcdb3ed6f1ff42fd2939a740693c56966b37 100644 --- a/source/application/State/GameState.cpp +++ b/source/application/State/GameState.cpp @@ -106,6 +106,7 @@ void GameState::update() { if (ptr_event) game_events.emplace_back(std::move(ptr_event)); if (context.pacman2.get_location() != nullptr) { + context.pacman2.set_active(); IVisitor* ptr_visitor2 = &(context.pacman2); auto ptr_event2 = ptr_entity->accept(ptr_visitor2); if (ptr_event2) game_events.emplace_back(std::move(ptr_event2));