- FrameRate class is more flexible
authorTobias Gläßer <tobi.web@gmx.de>
Thu, 29 Jul 2004 11:05:28 +0000 (11:05 +0000)
committerTobias Gläßer <tobi.web@gmx.de>
Thu, 29 Jul 2004 11:05:28 +0000 (11:05 +0000)
- All "game-loops" use the FrameRate class now

SVN-Revision: 1665

lib/special/frame_rate.cpp
lib/special/frame_rate.h
src/title.cpp
src/worldmap.cpp

index a4b1b77..3e85783 100644 (file)
@@ -26,6 +26,7 @@ using namespace SuperTux;
 FrameRate::FrameRate(double fps)
 {
   set_fps(fps);
+  set_frame_limit(true);
 }
 
 void FrameRate::start()
@@ -38,6 +39,11 @@ void FrameRate::set_fps(double fps)
   frame_ms = static_cast<unsigned int>(1000.f/fps);
 }
 
+void FrameRate::set_frame_limit(bool set_limit)
+{
+  frame_limit = set_limit;
+}
+
 double FrameRate::get()
 {
   return ((double)(update_time-last_update_time))/(double)frame_ms;
@@ -52,10 +58,15 @@ void FrameRate::update()
   /* Pause till next frame, if the machine running the game is too fast: */
   /* FIXME: Works great for in OpenGl mode, where the CPU doesn't have to do that much. But
      the results in SDL mode aren't perfect (thought the 100 FPS are reached), even on an AMD2500+. */
-  if(last_update_time >= update_time - (frame_ms+2))
+  if(frame_limit && last_update_time >= update_time - (frame_ms+2))
     {
       SDL_Delay(frame_ms);
       update_time = Ticks::get();
     }
 }
 
+void FrameRate::smooth_hanger()
+{
+      if( (update_time - last_update_time) > frame_ms*100)
+        update_time = last_update_time = Ticks::get();
+}
index c5cd18e..646498d 100644 (file)
@@ -29,12 +29,15 @@ namespace SuperTux
       FrameRate(double fps);
       void start();
       void set_fps(double fps);
+      void set_frame_limit(bool);
       double get();
       void update();
+      void smooth_hanger();
     private:
       unsigned int last_update_time;
       unsigned int update_time;
       unsigned int frame_ms;
+      bool frame_limit;
     };
 
 } //namespace SuperTux
index dd720b2..1e913df 100644 (file)
@@ -42,6 +42,7 @@
 #include "high_scores.h"
 #include "gui/menu.h"
 #include "special/timer.h"
+#include "special/frame_rate.h"
 #include "app/setup.h"
 #include "level.h"
 #include "level_subset.h"
@@ -66,8 +67,6 @@ static bool walking;
 static Timer random_timer;
 
 static int frame;
-static unsigned int last_update_time;
-static unsigned int update_time;
 
 static GameSession* titlesession;
 
@@ -288,7 +287,9 @@ void title(void)
   /* --- Main title loop: --- */
   frame = 0;
 
-  update_time = Ticks::get();
+  FrameRate frame_rate(100);  
+  frame_rate.set_frame_limit(false);
+  
   random_timer.start(rand() % 2000 + 2000);
 
   Menu::set_current(main_menu);
@@ -296,11 +297,11 @@ void title(void)
   while (Menu::current())
     {
       // if we spent to much time on a menu entry
-      if( (update_time - last_update_time) > 1000)
-        update_time = last_update_time = Ticks::get();
-
+      frame_rate.smooth_hanger();
+    
       // Calculate the movement-factor
-      double frame_ratio = ((double)(update_time-last_update_time))/((double)FRAME_RATE);
+      double frame_ratio = frame_rate.get();
+      
       if(frame_ratio > 1.5) /* Quick hack to correct the unprecise CPU clocks a little bit. */
         frame_ratio = 1.5 + (frame_ratio - 1.5) * 0.85;
       /* Lower the frame_ratio that Tux doesn't jump to hectically throught the demo. */
@@ -358,7 +359,7 @@ void title(void)
                   leveleditor->run();
                   delete leveleditor;
                   Menu::set_current(main_menu);
-                  update_time = Ticks::get();
+                  frame_rate.update();
                   break;
                 case MNID_CREDITS:
                   display_text_file("CREDITS", SCROLL_SPEED_CREDITS, white_big_text , white_text, white_small_text, blue_text );
@@ -390,7 +391,7 @@ void title(void)
 
                 update_load_save_game_menu(load_game_menu);
                 Menu::set_current(main_menu);
-                update_time = Ticks::get();
+                frame_rate.update();
                 }
               else if (process_load_game_menu())
                 {
@@ -398,7 +399,7 @@ void title(void)
                   titlesession->get_current_sector()->activate();
                   titlesession->set_current();
                   //titletux.level_begin();
-                  update_time = Ticks::get();
+                  frame_rate.update();
                 }
             }
           else if(menu == contrib_menu)
@@ -415,9 +416,7 @@ void title(void)
      
       context.do_drawing();
 
-      /* Set the time of the last update and the time of the current update */
-      last_update_time = update_time;
-      update_time = Ticks::get();
+      frame_rate.update();
 
       /* Pause: */
       frame++;
index ad7fa47..0258a66 100644 (file)
@@ -28,6 +28,7 @@
 #include "video/screen.h"
 #include "video/drawing_context.h"
 #include "utils/lispreader.h"
+#include "special/frame_rate.h"
 #include "gameloop.h"
 #include "app/setup.h"
 #include "sector.h"
@@ -1013,24 +1014,23 @@ WorldMap::display()
 
   song = SoundManager::get()->load_music(datadir +  "/music/" + music);
   SoundManager::get()->play_music(song);
-  
-  unsigned int last_update_time;
-  unsigned int update_time;
 
-  last_update_time = update_time = Ticks::get();
+  FrameRate frame_rate(10);
+  frame_rate.set_frame_limit(false);
+
+  frame_rate.start();
 
   DrawingContext context;
   while(!quit)
     {
-      float delta = ((float)(update_time-last_update_time))/100.0;
+      float delta = frame_rate.get();
 
       delta *= 1.3f;
 
       if (delta > 10.0f)
         delta = .3f;
-      
-      last_update_time = update_time;
-      update_time      = Ticks::get();
+       
+      frame_rate.update();
 
       Vector tux_pos = tux->get_pos();
       if (1)
@@ -1048,7 +1048,7 @@ WorldMap::display()
       draw(context, offset);
       get_input();
       update(delta);
-
+      
       if(Menu::current())
         {
           Menu::current()->draw(context);