X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fapp%2FApplication.h;h=62d9740b943aa41107d78c32f704671f427a9392;hb=cc3d698b8c1ad09d7a3f9e3f28bc84e0ac1735ea;hp=909942b829730020ecd598e368bcbaefc4d7edcb;hpb=4a1816af30dcfe53181a25355bd51cc7b24a83f1;p=l2e.git diff --git a/src/app/Application.h b/src/app/Application.h index 909942b..62d9740 100644 --- a/src/app/Application.h +++ b/src/app/Application.h @@ -1,57 +1,83 @@ -/* - * Application.h - * - * Created on: Apr 8, 2012 - * Author: holy - */ - #ifndef APP_APPLICATION_H_ #define APP_APPLICATION_H_ +#include "fwd.h" +#include "Input.h" +#include "Timer.h" #include "../sdl/InitScreen.h" #include +#include #include 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(void); + Application(sdl::InitScreen &screen, State *initialState); + ~Application(); private: Application(const Application &); Application &operator =(const Application &); public: - void Run(void); - void Loop(void); + void Run(); + void Loop(); public: void ChangeState(State *); void PushState(State *); - void PopState(void); - void Quit(void); + void PopState(); + void Quit(); + Input &Buttons() { return input; } + const Input &Buttons() const { return input; } + Timers &GlobalTimers() { return globalTimers; } + +private: + struct StateCommand { + enum Type { + PUSH, POP, CHANGE + } type; + State *state; + }; private: - State *CurrentState(void); + State *CurrentState(); + bool StateChangePending() const { return !stateChanges.empty(); } + void UpdateState(); + void RealChangeState(State *); void RealPushState(State *); - void RealPopState(void); - void PopAllStates(void); + void RealPopState(); + void PopAllStates(); private: - void HandleEvents(void); + void HandleEvents(); void UpdateWorld(Uint32 deltaT); - void Render(void); + void Render(); private: - sdl::InitScreen *screen; + sdl::InitScreen &screen; std::stack states; + std::queue stateChanges; + Timers globalTimers; + Input input; Uint32 last; + bool inStateChage; };