From: Tobias Gläßer Date: Thu, 29 Jul 2004 11:05:28 +0000 (+0000) Subject: - FrameRate class is more flexible X-Git-Url: https://git.verplant.org/?a=commitdiff_plain;h=0ec5e4e756d691b396f0d8b54d051720fa21ed13;p=supertux.git - FrameRate class is more flexible - All "game-loops" use the FrameRate class now SVN-Revision: 1665 --- diff --git a/lib/special/frame_rate.cpp b/lib/special/frame_rate.cpp index a4b1b7737..3e857831d 100644 --- a/lib/special/frame_rate.cpp +++ b/lib/special/frame_rate.cpp @@ -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(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(); +} diff --git a/lib/special/frame_rate.h b/lib/special/frame_rate.h index c5cd18edc..646498d40 100644 --- a/lib/special/frame_rate.h +++ b/lib/special/frame_rate.h @@ -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 diff --git a/src/title.cpp b/src/title.cpp index dd720b284..1e913df98 100644 --- a/src/title.cpp +++ b/src/title.cpp @@ -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++; diff --git a/src/worldmap.cpp b/src/worldmap.cpp index ad7fa4728..0258a6670 100644 --- a/src/worldmap.cpp +++ b/src/worldmap.cpp @@ -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);