]> git.localhorst.tv Git - l2e.git/blobdiff - src/app/Application.cpp
added option for sped up integration
[l2e.git] / src / app / Application.cpp
index b84d7248da1a465b7eafa557cc85c0d393b6789f..830223ef0381c5025245cac2a6c09c1cce821895 100644 (file)
@@ -1,13 +1,7 @@
-/*
- * Application.cpp
- *
- *  Created on: Apr 8, 2012
- *      Author: holy
- */
-
 #include "Application.h"
 
 #include "State.h"
+#include "../sdl/InitScreen.h"
 
 #include <cassert>
 
@@ -17,6 +11,7 @@ Application::Application(sdl::InitScreen &screen, State *initialState)
 : screen(screen)
 , states()
 , last(SDL_GetTicks())
+, remaining(0)
 , inStateChage(false) {
        assert(initialState && "cannot create application without initial state");
        RealPushState(initialState);
@@ -85,32 +80,32 @@ void Application::PopState() {
 
 void Application::RealChangeState(State *s) {
        if (!states.empty()) {
-               states.top()->OnPauseState(*this, screen.Screen());
-               states.top()->OnExitState(*this, screen.Screen());
+               states.top()->PauseState(screen.Screen());
+               states.top()->ExitState(*this, screen.Screen());
                states.pop();
        }
        states.push(s);
-       s->OnEnterState(*this, screen.Screen());
-       s->OnResumeState(*this, screen.Screen());
+       s->EnterState(*this, screen.Screen());
+       s->ResumeState(screen.Screen());
 }
 
 void Application::RealPushState(State *s) {
        if (!states.empty()) {
-               states.top()->OnPauseState(*this, screen.Screen());
+               states.top()->PauseState(screen.Screen());
        }
        states.push(s);
-       s->OnEnterState(*this, screen.Screen());
-       s->OnResumeState(*this, screen.Screen());
+       s->EnterState(*this, screen.Screen());
+       s->ResumeState(screen.Screen());
 }
 
 void Application::RealPopState() {
        if (states.empty()) return;
-       states.top()->OnPauseState(*this, screen.Screen());
-       states.top()->OnExitState(*this, screen.Screen());
+       states.top()->PauseState(screen.Screen());
+       states.top()->ExitState(*this, screen.Screen());
        delete states.top();
        states.pop();
        if (!states.empty()) {
-               states.top()->OnResumeState(*this, screen.Screen());
+               states.top()->ResumeState(screen.Screen());
        }
 }
 
@@ -120,8 +115,8 @@ void Application::Quit() {
 
 void Application::PopAllStates() {
        while (!states.empty()) {
-               states.top()->OnPauseState(*this, screen.Screen());
-               states.top()->OnExitState(*this, screen.Screen());
+               states.top()->PauseState(screen.Screen());
+               states.top()->ExitState(*this, screen.Screen());
                delete states.top();
                states.pop();
        }
@@ -158,14 +153,14 @@ void Application::HandleEvents() {
        if (!CurrentState()) return;
        input.ResetInteractiveState();
        SDL_Event event;
-       while (SDL_PollEvent(&event)) {
+       while (!StateChangePending() && SDL_PollEvent(&event)) {
                switch (event.type) {
                        case SDL_QUIT:
                                PopAllStates();
                                break;
                        case SDL_VIDEORESIZE:
                                screen.Resize(event.resize.w, event.resize.h);
-                               CurrentState()->OnResize(event.resize.w, event.resize.h);
+                               CurrentState()->Resize(event.resize.w, event.resize.h);
                                break;
                        case SDL_KEYDOWN:
                        case SDL_KEYUP:
@@ -181,9 +176,16 @@ void Application::HandleEvents() {
 
 void Application::UpdateWorld(Uint32 deltaT) {
        if (!CurrentState()) return;
-       for (Uint32 i(0); i < deltaT && !StateChangePending(); ++i) {
-               CurrentState()->PhysicsTimers().Update(0.001f);
-               CurrentState()->UpdateWorld(0.001f);
+       remaining += deltaT;
+       Uint32 step = CurrentState()->Timestep();
+       if (step > 0) {
+               for (; remaining >= step && !StateChangePending(); remaining -= step) {
+                       CurrentState()->PhysicsTimers().Update(step);
+                       CurrentState()->UpdateWorld(step);
+               }
+       } else {
+                       CurrentState()->PhysicsTimers().Update(deltaT);
+                       CurrentState()->UpdateWorld(deltaT);
        }
 }