X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fapp%2FState.h;h=19b6fe0475fbb340a81941d193ca2c01af69ff2b;hb=cc3d698b8c1ad09d7a3f9e3f28bc84e0ac1735ea;hp=c74043bf6b7bacc1e2d2f336ed99a42115f261fd;hpb=6d080d21d8055df9962296863b4c0954bc81410b;p=l2e.git diff --git a/src/app/State.h b/src/app/State.h index c74043b..19b6fe0 100644 --- a/src/app/State.h +++ b/src/app/State.h @@ -1,52 +1,79 @@ -/* - * State.h - * - * Created on: Apr 8, 2012 - * Author: holy - */ - #ifndef APP_APPLICATIONSTATE_H_ #define APP_APPLICATIONSTATE_H_ +#include "fwd.h" #include "Timer.h" #include namespace app { -class Application; -class Input; - +/// Application state base class for use with app::Application. class State { public: - virtual ~State() { }; + State(); + virtual ~State(); public: - /// do some setup - /// called when the state first enters the stack - /// @param ctrl the Application running the state - virtual void EnterState(Application &ctrl, SDL_Surface *screen) = 0; - /// do some cleanup - /// called when the state is popped from the stack - virtual void ExitState(Application &ctrl, SDL_Surface *screen) = 0; - /// called when the state becomes the active one - virtual void ResumeState(Application &ctrl, SDL_Surface *screen) = 0; - /// called when the state becomes inactive - virtual void PauseState(Application &ctrl, SDL_Surface *screen) = 0; - - /// adapt the state's graphics to given dimensions - virtual void Resize(int width, int height) = 0; + /// Called by Application when pushing this state. + void EnterState(Application &ctrl, SDL_Surface *screen); + /// Called by Application when popping this state. + void ExitState(Application &ctrl, SDL_Surface *screen); + /// Called by Application when this state becomes the top state. + void ResumeState(SDL_Surface *screen); + /// Called by Application when this state no longer is the top state. + void PauseState(SDL_Surface *screen); + /// Called by Application on SDL window resize events. + void Resize(int width, int height); + + /// Handle interactive events such as input and timers. virtual void HandleEvents(const Input &) = 0; + /// Update the time-dependant world representation. virtual void UpdateWorld(float deltaT) = 0; + /// Draw a picture of the world. virtual void Render(SDL_Surface *) = 0; +protected: + /// Get a handle to the application this state is running on. + /// Do not call this while the state is off the stack (e.g. in c'tor/d'tor) + /// or you'll get a std::domain_error (potentially evil in d'tor)! + Application &Ctrl(); + const Application &Ctrl() const; + +private: + /// Do some setup that needs an application and/or screen handle and thus + /// can not be done by the constructor. + /// Called when the state first enters the stack. + /// @param ctrl the Application running the state + virtual void OnEnterState(SDL_Surface *screen) = 0; + /// Do some cleanup. + /// Called when the state is popped from the stack. + virtual void OnExitState(SDL_Surface *screen) = 0; + /// Called when the state becomes the active one. + virtual void OnResumeState(SDL_Surface *screen) = 0; + /// Called when the state becomes inactive. + virtual void OnPauseState(SDL_Surface *screen) = 0; + + /// Adapt the state's graphics to given dimensions. + /// NOTE: currently, this is only called for the stack top and not + /// propagated on stack changes. + /// Will be fixed soom ;). + virtual void OnResize(int width, int height) = 0; + public: + /// Timers handle intended for graphics, sync'ed with render time. + /// These timers are only updated for the stack top and thus appear paused + /// when the state is visible (roughly). Timers &GraphicsTimers() { return graphicsTimers; } + /// Timers handle intended for graphics, sync'ed with world time. + /// These timers are only updated for the stack top and thus appear paused + /// when the state is visible (roughly). Timers &PhysicsTimers() { return physicsTimers; } private: + Application *ctrl; Timers graphicsTimers; Timers physicsTimers;