]> git.localhorst.tv Git - blank.git/blob - src/app/Application.hpp
new gcc version
[blank.git] / src / app / Application.hpp
1 #ifndef BLANK_APP_APPLICATION_HPP_
2 #define BLANK_APP_APPLICATION_HPP_
3
4 #include <SDL.h>
5 #include <stack>
6
7
8 namespace blank {
9
10 class Environment;
11 class HeadlessEnvironment;
12 class State;
13 class Window;
14
15 class HeadlessApplication {
16
17 public:
18         explicit HeadlessApplication(HeadlessEnvironment &);
19         ~HeadlessApplication();
20
21         void PushState(State *);
22         State *PopState();
23         State *SwitchState(State *);
24         State &GetState();
25         void CommitStates();
26         bool HasState() const noexcept;
27
28         /// run until out of states
29         void Run();
30         /// evaluate a single frame of dt milliseconds
31         virtual void Loop(int dt);
32
33         /// run for n frames
34         void RunN(size_t n);
35         /// run for t milliseconds
36         void RunT(size_t t);
37         /// run for n frames, assuming t milliseconds for each
38         void RunS(size_t n, size_t t);
39
40         /// process all events in SDL's queue
41         void HandleEvents();
42         void Handle(const SDL_Event &);
43         /// integrate to the next step with dt milliseconds passed
44         void Update(int dt);
45
46 private:
47         HeadlessEnvironment &env;
48         std::stack<State *> states;
49
50 };
51
52
53 class Application
54 : public HeadlessApplication {
55
56 public:
57         explicit Application(Environment &);
58         ~Application();
59
60         Application(const Application &) = delete;
61         Application &operator =(const Application &) = delete;
62
63         void Loop(int dt) override;
64
65         /// process all events in SDL's queue
66         void HandleEvents();
67         void Handle(const SDL_Event &);
68         void Handle(const SDL_WindowEvent &);
69         /// integrate to the next step with dt milliseconds passed
70         void Update(int dt);
71         /// push the current state to display
72         void Render();
73
74 private:
75         Environment &env;
76
77 };
78
79 }
80
81 #endif