X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fapp%2FApplication.h;h=df5de259857c8c4d8c7e231ff799c1a165b2b2b7;hb=ede708d4e15a34a4443727fc64fd28946fcbeb41;hp=853d0cb25cefc91897beeaa41e7365f027a2604a;hpb=2a0eca649009f78028db286a67a532429cab5b88;p=l2e.git diff --git a/src/app/Application.h b/src/app/Application.h index 853d0cb..df5de25 100644 --- a/src/app/Application.h +++ b/src/app/Application.h @@ -8,7 +8,9 @@ #ifndef APP_APPLICATION_H_ #define APP_APPLICATION_H_ +#include "fwd.h" #include "Input.h" +#include "Timer.h" #include "../sdl/InitScreen.h" #include @@ -18,12 +20,23 @@ namespace app { -class State; - +/// Application controller class. +/// Operates on a state stack that can be modified via ChangeState, PushState, +/// and PopState. +/// All state changes are delayed until the looping mechanism gets control again +/// (i.e. after a top level state function returns, not during). +/// SDL key events are preprocessed, see app::Input. +/// The quit event (typically window closed or signal received) is caught and +/// results in immediate (that is, after the next input loop) termination. +/// Popped states will be deleted via the plain delete operator on an app::State +/// pointer. +/// Timers created by GlobalTimers() operate on actual application time and are +/// not paused when the current state is paused (as are the timers started by +/// the app::State members). class Application { public: - Application(sdl::InitScreen *screen, State *initialState); + Application(sdl::InitScreen &screen, State *initialState); ~Application(); private: Application(const Application &); @@ -40,6 +53,7 @@ public: void Quit(); Input &Buttons() { return input; } const Input &Buttons() const { return input; } + Timers &GlobalTimers() { return globalTimers; } private: struct StateCommand { @@ -51,6 +65,7 @@ private: private: State *CurrentState(); + bool StateChangePending() const { return !stateChanges.empty(); } void UpdateState(); void RealChangeState(State *); void RealPushState(State *); @@ -63,11 +78,13 @@ private: void Render(); private: - sdl::InitScreen *screen; + sdl::InitScreen &screen; std::stack states; std::queue stateChanges; + Timers globalTimers; Input input; Uint32 last; + bool inStateChage; };