-/*
- * State.h
- *
- * Created on: Apr 8, 2012
- * Author: holy
- */
-
#ifndef APP_APPLICATIONSTATE_H_
#define APP_APPLICATIONSTATE_H_
+namespace app {
+ class Application;
+ class Input;
+}
+
#include "Timer.h"
#include <SDL.h>
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;
- virtual void UpdateWorld(float deltaT) = 0;
+ /// Update the time-dependant world representation.
+ virtual void UpdateWorld(Uint32 deltaMs) = 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<Uint32> &GraphicsTimers() { return graphicsTimers; }
- Timers<float> &PhysicsTimers() { return physicsTimers; }
+ /// 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<Uint32> &PhysicsTimers() { return physicsTimers; }
private:
+ Application *ctrl;
Timers<Uint32> graphicsTimers;
- Timers<float> physicsTimers;
+ Timers<Uint32> physicsTimers;
};
}
-#endif /* APP_STATE_H_ */
+#endif