From dd3848e9f5cb667484c5b862d4582c61d930d16d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9F=D0=B5=D1=87=D0=B5=D0=BD=D0=B8=D0=BD=20=D0=94=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D0=BB=D0=B0=20=D0=9C=D0=B8=D1=85=D0=B0=D0=B9=D0=BB?= =?UTF-8?q?=D0=BE=D0=B2=D0=B8=D1=87?= <dmpechenin@edu.hse.ru> Date: Sat, 8 Mar 2025 15:15:25 +0300 Subject: [PATCH] ContextManager was done --- source/States/GameState/ContextManager.cpp | 19 +++++++++++++++++++ source/States/GameState/ContextManager.h | 14 ++++++++++++++ source/States/GameState/GameState.cpp | 2 +- source/States/GameState/GameState.h | 14 ++++++++++++-- source/States/GameState/Maze/Maze.h | 1 + source/States/SelectState/SelectState.h | 1 + 6 files changed, 48 insertions(+), 3 deletions(-) create mode 100644 source/States/GameState/ContextManager.cpp create mode 100644 source/States/GameState/ContextManager.h diff --git a/source/States/GameState/ContextManager.cpp b/source/States/GameState/ContextManager.cpp new file mode 100644 index 0000000..cbd7f8a --- /dev/null +++ b/source/States/GameState/ContextManager.cpp @@ -0,0 +1,19 @@ +#include <States/GameState/ContextManager.h> + +void ContextManager::reset(GameContext&& context) { + while (!m_contexts.empty()) + m_contexts.pop(); + m_initial_context = std::move(context); + m_contexts.emplace(m_initial_context.clone()); +} + +void ContextManager::save_context() { + m_contexts.emplace(m_contexts.top().clone()); +} + +void ContextManager::restore_previous_context() { + if (m_contexts.size() > 1) + m_contexts.pop(); + else + m_contexts.top() = m_initial_context.clone(); +} diff --git a/source/States/GameState/ContextManager.h b/source/States/GameState/ContextManager.h new file mode 100644 index 0000000..8c0adc9 --- /dev/null +++ b/source/States/GameState/ContextManager.h @@ -0,0 +1,14 @@ +#pragma once +#include <States/GameState/GameContext.h> +#include <stack> + +class ContextManager { +public: + void reset(GameContext&& context); + GameContext& get_current_context() { return m_contexts.top(); } + void save_context(); + void restore_previous_context(); +private: + GameContext m_initial_context; + std::stack<GameContext> m_contexts; +}; diff --git a/source/States/GameState/GameState.cpp b/source/States/GameState/GameState.cpp index 8aec679..56b7e71 100644 --- a/source/States/GameState/GameState.cpp +++ b/source/States/GameState/GameState.cpp @@ -1,4 +1,4 @@ -#include "GameState.h" +#include <States/GameState/GameState.h> #include <iostream> /// @todo remove it #include <States/ExitState/ExitState.h> diff --git a/source/States/GameState/GameState.h b/source/States/GameState/GameState.h index aa1d5ca..2ddcd95 100644 --- a/source/States/GameState/GameState.h +++ b/source/States/GameState/GameState.h @@ -1,12 +1,22 @@ #pragma once #include <BasicAbstractions/IState.h> #include <BasicAbstractions/IWindowKeeper.h> +#include <States/GameState/Maze/Maze.h> +#include <States/GameState/ContextManager.h> -struct GameState : IState, IWindowKeeper { - explicit GameState(IStateManager& state_manager, const sf::VideoMode& video_mode, const sf::String& window_title) : IState(state_manager), IWindowKeeper(video_mode, window_title) {} +class GameState : IState, IWindowKeeper { +public: + explicit GameState(IStateManager& state_manager, const sf::VideoMode& video_mode, const sf::String& window_title) : + IState(state_manager), IWindowKeeper(video_mode, window_title) {} bool do_step() override; + void set_maze(Maze&& maze) { m_maze = std::move(maze); } + void set_context(GameContext&& context) { m_context_manager.reset(std::move(context)); } +private: void event_handling() override {}; void update() override {}; void render() override {}; +private: + Maze m_maze; + ContextManager m_context_manager; }; diff --git a/source/States/GameState/Maze/Maze.h b/source/States/GameState/Maze/Maze.h index a188a84..7562d5a 100644 --- a/source/States/GameState/Maze/Maze.h +++ b/source/States/GameState/Maze/Maze.h @@ -6,6 +6,7 @@ class Maze : public IDrawable { public: + Maze() = default; explicit Maze(std::vector<std::unique_ptr<Room>> rooms) : m_rooms(std::move(rooms)) {} void draw_into(sf::RenderWindow& window) const override; private: diff --git a/source/States/SelectState/SelectState.h b/source/States/SelectState/SelectState.h index ab2915e..c0d4371 100644 --- a/source/States/SelectState/SelectState.h +++ b/source/States/SelectState/SelectState.h @@ -33,6 +33,7 @@ public: explicit SelectState(IStateManager& state_manager, const sf::VideoMode& video_mode, const sf::String& window_title) : IState(state_manager), IWindowKeeper(video_mode, window_title), m_menu(state_manager) {} bool do_step() override; +private: void event_handling() override; void update() override; void render() override; -- GitLab