* Comment out resizable flag because it blue-screens on Windows
[supertux.git] / src / mainloop.cpp
index 1a7a132..444d3d2 100644 (file)
@@ -29,6 +29,7 @@
 #include "scripting/time_scheduler.hpp"
 #include "scripting/squirrel_util.hpp"
 #include "gameconfig.hpp"
+#include "constants.hpp"
 #include "main.hpp"
 #include "resources.hpp"
 #include "screen.hpp"
 #include "video/renderer.hpp"
 #include "random_generator.hpp"
 
-// the engine will be run with a logical framerate of 64fps.
-// We chose 64fps here because it is a power of 2, so 1/64 gives an "even"
-// binary fraction...
-static const float LOGICAL_FPS = 64.0;
 /** ticks (as returned from SDL_GetTicks) per frame */
 static const Uint32 TICKS_PER_FRAME = (Uint32) (1000.0 / LOGICAL_FPS);
 /** don't skip more than every 2nd frame */
@@ -77,7 +74,7 @@ MainLoop::push_screen(Screen* screen, ScreenFade* screen_fade)
   this->screen_fade.reset(screen_fade);
   nextpush = !nextpop;
   nextpop = false;
-  speed = 1.0;
+  speed = 1.0f;
 }
 
 void
@@ -118,14 +115,20 @@ MainLoop::get_speed() const
   return speed;
 }
 
+bool
+MainLoop::has_no_pending_fadeout() const
+{
+  return screen_fade.get() == NULL || screen_fade->done();
+}
+
 void
 MainLoop::draw_fps(DrawingContext& context, float fps_fps)
 {
   char str[60];
   snprintf(str, sizeof(str), "%3.1f", fps_fps);
   const char* fpstext = "FPS";
-  context.draw_text(white_text, fpstext, Vector(SCREEN_WIDTH - white_text->get_text_width(fpstext) - gold_text->get_text_width(" 99999") - BORDER_X, BORDER_Y + 20), ALIGN_LEFT, LAYER_HUD);
-  context.draw_text(gold_text, str, Vector(SCREEN_WIDTH - BORDER_X, BORDER_Y + 20), ALIGN_RIGHT, LAYER_HUD);
+  context.draw_text(small_font, fpstext, Vector(SCREEN_WIDTH - small_font->get_text_width(fpstext) - small_font->get_text_width(" 99999") - BORDER_X, BORDER_Y + 20), ALIGN_LEFT, LAYER_HUD);
+  context.draw_text(small_font, str, Vector(SCREEN_WIDTH - BORDER_X, BORDER_Y + 20), ALIGN_RIGHT, LAYER_HUD);
 }
 
 void
@@ -171,6 +174,8 @@ MainLoop::update_gamelogic(float elapsed_time)
   Scripting::update_debugger();
   Scripting::TimeScheduler::instance->update(game_time);
   current_screen->update(elapsed_time);
+  if (Menu::current() != NULL)
+       Menu::current()->update();
   if(screen_fade.get() != NULL)
     screen_fade->update(elapsed_time);
   Console::instance->update(elapsed_time);
@@ -233,7 +238,7 @@ void
 MainLoop::handle_screen_switch()
 {
   while( (next_screen.get() != NULL || nextpop) &&
-      (screen_fade.get() == NULL || screen_fade->done())) {
+      has_no_pending_fadeout()) {
     if(current_screen.get() != NULL) {
       current_screen->leave();
     }
@@ -290,29 +295,32 @@ MainLoop::run(DrawingContext &context)
       elapsed_ticks = 0;
     }
 
+    if(elapsed_ticks < ticks_per_frame)
+      {
+        Uint32 delay_ticks = ticks_per_frame - elapsed_ticks;
+        SDL_Delay(delay_ticks);
+        last_ticks += delay_ticks;
+        elapsed_ticks += delay_ticks;
+      }
+
     int frames = 0;
 
-    if (elapsed_ticks > ticks_per_frame
+    while(elapsed_ticks >= ticks_per_frame && frames < MAX_FRAME_SKIP
       {
-        while(elapsed_ticks > ticks_per_frame && frames < MAX_FRAME_SKIP) 
-          {
-            elapsed_ticks -= ticks_per_frame;
-            float timestep = 1.0 / LOGICAL_FPS;
-            real_time += timestep;
-            timestep *= speed;
-            game_time += timestep;
-
-            process_events();
-            update_gamelogic(timestep);
-            frames += 1;
-          }
-
-        draw(context);
+        elapsed_ticks -= ticks_per_frame;
+        float timestep = 1.0 / LOGICAL_FPS;
+        real_time += timestep;
+        timestep *= speed;
+        game_time += timestep;
+
+        process_events();
+        update_gamelogic(timestep);
+        frames += 1;
       }
 
-    sound_manager->update();
+    draw(context);
 
-    SDL_Delay(0);
+    sound_manager->update();
   }
 }