]> git.localhorst.tv Git - l2e.git/blobdiff - src/app/Application.cpp
switched geometric scalars from floating to fixed
[l2e.git] / src / app / Application.cpp
index 4ff75d8ed10c1104f9abf38142b4ffe46c9d3a5a..76d98efc7fbc2609053391f7b7894693523a6c9f 100644 (file)
@@ -1,10 +1,3 @@
-/*
- * Application.cpp
- *
- *  Created on: Apr 8, 2012
- *      Author: holy
- */
-
 #include "Application.h"
 
 #include "State.h"
 
 namespace app {
 
-Application::Application(sdl::InitScreen *screen, State *initialState)
+Application::Application(sdl::InitScreen &screen, State *initialState)
 : screen(screen)
 , states()
-, last(SDL_GetTicks()) {
-       assert(screen && "cannot create application without screen");
+, last(SDL_GetTicks())
+, inStateChage(false) {
        assert(initialState && "cannot create application without initial state");
        RealPushState(initialState);
 }
@@ -32,6 +25,7 @@ State *Application::CurrentState() {
 }
 
 void Application::UpdateState() {
+       inStateChage = true;
        while (!stateChanges.empty()) {
                switch (stateChanges.front().type) {
                        case StateCommand::PUSH:
@@ -46,57 +40,70 @@ void Application::UpdateState() {
                }
                stateChanges.pop();
        }
+       inStateChage = false;
 }
 
 void Application::ChangeState(State *s) {
-       StateCommand cmd;
-       cmd.type = StateCommand::CHANGE;
-       cmd.state = s;
-       stateChanges.push(cmd);
+       if (inStateChage) {
+               RealChangeState(s);
+       } else {
+               StateCommand cmd;
+               cmd.type = StateCommand::CHANGE;
+               cmd.state = s;
+               stateChanges.push(cmd);
+       }
 }
 
 void Application::PushState(State *s) {
-       StateCommand cmd;
-       cmd.type = StateCommand::PUSH;
-       cmd.state = s;
-       stateChanges.push(cmd);
+       if (inStateChage) {
+               RealPushState(s);
+       } else {
+               StateCommand cmd;
+               cmd.type = StateCommand::PUSH;
+               cmd.state = s;
+               stateChanges.push(cmd);
+       }
 }
 
 void Application::PopState() {
-       StateCommand cmd;
-       cmd.type = StateCommand::POP;
-       cmd.state = 0;
-       stateChanges.push(cmd);
+       if (inStateChage) {
+               RealPopState();
+       } else {
+               StateCommand cmd;
+               cmd.type = StateCommand::POP;
+               cmd.state = 0;
+               stateChanges.push(cmd);
+       }
 }
 
 void Application::RealChangeState(State *s) {
        if (!states.empty()) {
-               states.top()->PauseState(*this, screen->Screen());
-               states.top()->ExitState(*this, screen->Screen());
+               states.top()->PauseState(screen.Screen());
+               states.top()->ExitState(*this, screen.Screen());
                states.pop();
        }
        states.push(s);
-       s->EnterState(*this, screen->Screen());
-       s->ResumeState(*this, screen->Screen());
+       s->EnterState(*this, screen.Screen());
+       s->ResumeState(screen.Screen());
 }
 
 void Application::RealPushState(State *s) {
        if (!states.empty()) {
-               states.top()->PauseState(*this, screen->Screen());
+               states.top()->PauseState(screen.Screen());
        }
        states.push(s);
-       s->EnterState(*this, screen->Screen());
-       s->ResumeState(*this, screen->Screen());
+       s->EnterState(*this, screen.Screen());
+       s->ResumeState(screen.Screen());
 }
 
 void Application::RealPopState() {
        if (states.empty()) return;
-       states.top()->PauseState(*this, screen->Screen());
-       states.top()->ExitState(*this, screen->Screen());
+       states.top()->PauseState(screen.Screen());
+       states.top()->ExitState(*this, screen.Screen());
        delete states.top();
        states.pop();
        if (!states.empty()) {
-               states.top()->ResumeState(*this, screen->Screen());
+               states.top()->ResumeState(screen.Screen());
        }
 }
 
@@ -106,8 +113,8 @@ void Application::Quit() {
 
 void Application::PopAllStates() {
        while (!states.empty()) {
-               states.top()->PauseState(*this, screen->Screen());
-               states.top()->ExitState(*this, screen->Screen());
+               states.top()->PauseState(screen.Screen());
+               states.top()->ExitState(*this, screen.Screen());
                delete states.top();
                states.pop();
        }
@@ -150,7 +157,7 @@ void Application::HandleEvents() {
                                PopAllStates();
                                break;
                        case SDL_VIDEORESIZE:
-                               screen->Resize(event.resize.w, event.resize.h);
+                               screen.Resize(event.resize.w, event.resize.h);
                                CurrentState()->Resize(event.resize.w, event.resize.h);
                                break;
                        case SDL_KEYDOWN:
@@ -168,15 +175,15 @@ 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);
+               CurrentState()->PhysicsTimers().Update(1);
+               CurrentState()->UpdateWorld(1);
        }
 }
 
 void Application::Render(void) {
        if (!CurrentState()) return;
-       CurrentState()->Render(screen->Screen());
-       screen->Flip();
+       CurrentState()->Render(screen.Screen());
+       screen.Flip();
 }
 
 }