blob: 6ea5ccc9ead109abee2d7186517e58bd887049fc (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
#pragma once
#include <memory>
#include "../manager/ComponentManager.h"
#include "../manager/SceneManager.h"
#include "../system/System.h"
#include "../facade/SDLContext.h"
#include "LoopTimer.h"
namespace crepe {
/**
* \brief Main game loop manager
*
* This class is responsible for managing the game loop, including initialization and updating.
*/
class LoopManager {
public:
void start();
LoopManager();
/**
* \brief Add a new concrete scene to the scene manager
*
* \tparam T Type of concrete scene
*/
template <typename T>
void add_scene();
private:
/**
* \brief Setup function for one-time initialization.
*
* This function initializes necessary components for the game.
*/
void setup();
/**
* \brief Main game loop function.
*
* This function runs the main loop, handling game updates and rendering.
*/
void loop();
/**
* \brief Function for handling input-related system calls.
*
* Processes user inputs from keyboard and mouse.
*/
void process_input();
/**
* \brief Per-frame update.
*
* Updates the game state based on the elapsed time since the last frame.
*/
void update();
/**
* \brief Late update which is called after update().
*
* This function can be used for final adjustments before rendering.
*/
void late_update();
/**
* \brief Fixed update executed at a fixed rate.
*
* This function updates physics and game logic based on LoopTimer's fixed_delta_time.
*/
void fixed_update();
/**
* \brief Set game running variable
*
* \param running running (false = game shutdown, true = game running)
*/
void set_running(bool running);
/**
* \brief Function for executing render-related systems.
*
* Renders the current state of the game to the screen.
*/
void render();
bool game_running = false;
private:
//! Global context
Mediator mediator;
//! Component manager instance
ComponentManager component_manager{mediator};
//! Scene manager instance
SceneManager scene_manager{mediator};
//! SDL context \todo no more singletons!
SDLContext & sdl_context = SDLContext::get_instance();
//! Loop timer \todo no more singletons!
LoopTimer & loop_timer = LoopTimer::get_instance();
private:
/**
* \brief Collection of System instances
*
* This map holds System instances indexed by the system's class typeid. It is filled in the
* constructor of \c LoopManager using LoopManager::load_system.
*/
std::unordered_map<std::type_index, std::unique_ptr<System>> systems;
/**
* \brief Initialize a system
* \tparam T System type (must be derivative of \c System)
*/
template <class T>
void load_system();
/**
* \brief Retrieve a reference to ECS system
* \tparam T System type
* \returns Reference to system instance
* \throws std::runtime_error if the System is not initialized
*/
template <class T>
T & get_system();
};
} // namespace crepe
#include "LoopManager.hpp"
|