diff --git a/source/States/GameState/ContextManager.cpp b/source/States/GameState/ContextManager.cpp new file mode 100644 index 0000000000000000000000000000000000000000..cbd7f8ae71c8f6db3d7f0252ff481f9f5e90ef8e --- /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 0000000000000000000000000000000000000000..8c0adc92e6207c911f2947e3d494a98eff186db9 --- /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 8aec6792c3c108d9275c2c895d8d2655d17a3176..56b7e71f197ff6487744f0ffbf9ccef23947969a 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 aa1d5ca80235302287185188bf758a7054ea1efe..2ddcd958e771c29025babcb772360e113cc00d75 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 a188a840b6153f61bc6fd0ac7c7b47eceb5a2da6..7562d5a598b7276839bbd60ff4fb1cde0bb0ba89 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 ab2915e37d72bfff94ebc8b576bc1a9a4ea06a63..c0d43718df639bad32ac5d3594e540a27c324c22 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;