#ifndef APP_APPLICATIONSTATE_H_
#define APP_APPLICATIONSTATE_H_
-#include <SDL/SDL.h>
+#include "fwd.h"
+#include "Timer.h"
-namespace app {
+#include <SDL.h>
-class Application;
+namespace app {
+/// Application state base class for use with app::Application.
class State {
public:
virtual ~State() { };
public:
- /// do some setup
+ /// 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 EnterState(Application &ctrl, SDL_Surface *screen) = 0;
- virtual void ExitState() = 0;
+ virtual void OnEnterState(Application &ctrl, SDL_Surface *screen) = 0;
+ /// Do some cleanup.
+ /// Called when the state is popped from the stack.
+ virtual void OnExitState(Application &ctrl, SDL_Surface *screen) = 0;
+ /// Called when the state becomes the active one.
+ virtual void OnResumeState(Application &ctrl, SDL_Surface *screen) = 0;
+ /// Called when the state becomes inactive.
+ virtual void OnPauseState(Application &ctrl, 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 Resize(int width, int height) = 0;
- virtual void HandleEvent(const SDL_Event &) = 0;
+ /// 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;
+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<Uint32> &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<float> &PhysicsTimers() { return physicsTimers; }
+
+private:
+ Timers<Uint32> graphicsTimers;
+ Timers<float> physicsTimers;
+
};
}