X-Git-Url: https://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fapp%2FApplication.cpp;h=830223ef0381c5025245cac2a6c09c1cce821895;hb=60e0b9e8ec660a4f6b8e500bf0b77a31bb817b45;hp=b84d7248da1a465b7eafa557cc85c0d393b6789f;hpb=2ccc2369d32fb680a3047519d79c17de34c4e10a;p=l2e.git diff --git a/src/app/Application.cpp b/src/app/Application.cpp index b84d724..830223e 100644 --- a/src/app/Application.cpp +++ b/src/app/Application.cpp @@ -1,13 +1,7 @@ -/* - * Application.cpp - * - * Created on: Apr 8, 2012 - * Author: holy - */ - #include "Application.h" #include "State.h" +#include "../sdl/InitScreen.h" #include @@ -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); } }