-/*
- * Application.h
- *
- * Created on: Apr 8, 2012
- * Author: holy
- */
-
#ifndef APP_APPLICATION_H_
#define APP_APPLICATION_H_
-#include "../sdl/InitScreen.h"
+namespace app {
+ class State;
+}
+namespace sdl {
+ class InitScreen;
+}
+
+#include "Input.h"
+#include "Timer.h"
#include <stack>
+#include <queue>
#include <SDL.h>
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<Uint32> &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<State *> states;
+ std::queue<StateCommand> stateChanges;
+ Timers<Uint32> globalTimers;
+ Input input;
Uint32 last;
+ Uint32 remaining;
+ bool inStateChage;
};
}
-#endif /* APP_APPLICATION_H_ */
+#endif