]> git.localhorst.tv Git - l2e.git/commitdiff
added option for sped up integration
authorDaniel Karbach <daniel.karbach@localhorst.tv>
Tue, 20 Aug 2013 07:42:30 +0000 (09:42 +0200)
committerDaniel Karbach <daniel.karbach@localhorst.tv>
Wed, 4 Sep 2013 16:42:20 +0000 (18:42 +0200)
src/app/Application.cpp
src/app/Application.h
src/app/State.h

index 64a8602e8d9b1c551bd2940224c3a1ab72746292..830223ef0381c5025245cac2a6c09c1cce821895 100644 (file)
@@ -11,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);
@@ -152,7 +153,7 @@ 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();
@@ -175,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(1);
-               CurrentState()->UpdateWorld(1);
+       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);
        }
 }
 
index 817f79fd2217499cd470c04eb22e1ff6755f91f9..db089e09356c168509f5bc1dcd2c4d8b741e4bab 100644 (file)
@@ -82,6 +82,7 @@ private:
        Timers<Uint32> globalTimers;
        Input input;
        Uint32 last;
+       Uint32 remaining;
        bool inStateChage;
 
 };
index 84082aeb8f322bf5a956378ef6aaecce57051447..31a4ae0462220a62e5c87d50f7d5920794e83d16 100644 (file)
@@ -39,6 +39,9 @@ public:
        /// Draw a picture of the world.
        virtual void Render(SDL_Surface *) = 0;
 
+       /// Number of milliseconds per simulation frame.
+       Uint32 Timestep() const { return timestep; }
+
 protected:
        /// Get a handle to the application this state is running on.
        /// Do not call this while the state is off the stack (e.g. in c'tor/d'tor)
@@ -46,6 +49,9 @@ protected:
        Application &Ctrl();
        const Application &Ctrl() const;
 
+       /// Set the number of milliseconds per simulation frame.
+       void Timestep(Uint32 t) { timestep = t; }
+
 private:
        /// Do some setup that needs an application and/or screen handle and thus
        /// can not be done by the constructor.
@@ -63,23 +69,24 @@ private:
        /// Adapt the state's graphics to given dimensions.
        /// NOTE: currently, this is only called for the stack top and not
        ///       propagated on stack changes.
-       ///       Will be fixed soom ;).
+       ///       Will be fixed sometime ;).
        virtual void OnResize(int width, int height) = 0;
 
 public:
        /// Timers handle intended for graphics, sync'ed with render time.
        /// These timers are only updated for the stack top and thus appear paused
-       /// when the state is visible (roughly).
+       /// when the state is invisible (roughly).
        Timers<Uint32> &GraphicsTimers() { return graphicsTimers; }
        /// Timers handle intended for graphics, sync'ed with world time.
        /// These timers are only updated for the stack top and thus appear paused
-       /// when the state is visible (roughly).
+       /// when the state is invisible (roughly).
        Timers<Uint32> &PhysicsTimers() { return physicsTimers; }
 
 private:
        Application *ctrl;
        Timers<Uint32> graphicsTimers;
        Timers<Uint32> physicsTimers;
+       Uint32 timestep;
 
 };