]> git.tdb.fi Git - libs/game.git/blob - source/game/system.h
Add a way for systems to do things at the end of a tick
[libs/game.git] / source / game / system.h
1 #ifndef MSP_GAME_SYSTEM_H_
2 #define MSP_GAME_SYSTEM_H_
3
4 #include <functional>
5 #include <msp/time/timedelta.h>
6
7 namespace Msp::Game {
8
9 class Stage;
10
11 class System
12 {
13 protected:
14         Stage &stage;
15         std::vector<std::function<void()>> deferred_queue;
16
17         System(Stage &s): stage(s) { }
18 public:
19         virtual ~System() = default;
20
21         Stage &get_stage() const { return stage; }
22
23         virtual void tick(Time::TimeDelta) = 0;
24         virtual void deferred_tick();
25
26 protected:
27         template<typename F>
28         void defer(F &&f) { deferred_queue.emplace_back(std::forward<F>(f)); }
29 };
30
31 } // namespace Msp::Game
32
33 #endif