State *Application::CurrentState() {
- return states.top();
+ return states.empty() ? 0 : states.top();
}
void Application::UpdateState() {
void Application::PopAllStates() {
while (!states.empty()) {
- RealPopState();
+ states.top()->PauseState(*this, screen->Screen());
+ states.top()->ExitState(*this, screen->Screen());
+ delete states.top();
+ states.pop();
}
}
void Application::Loop() {
Uint32 now(SDL_GetTicks());
Uint32 deltaT(now - last);
- if (deltaT > 34) deltaT = 34;
+ GlobalTimers().Update(deltaT);
+ if (deltaT > 30) deltaT = 30;
+ if (CurrentState()) {
+ CurrentState()->GraphicsTimers().Update(deltaT);
+ }
HandleEvents();
if (!StateChangePending()) {
UpdateWorld(deltaT);
break;
}
}
- CurrentState()->HandleInput(input);
+ if (CurrentState()) CurrentState()->HandleEvents(input);
}
void Application::UpdateWorld(Uint32 deltaT) {
if (!CurrentState()) return;
for (Uint32 i(0); i < deltaT; ++i) {
+ CurrentState()->PhysicsTimers().Update(0.001f);
CurrentState()->UpdateWorld(0.001f);
}
}