FrameRate::FrameRate(double fps)
{
set_fps(fps);
+ set_frame_limit(true);
}
void FrameRate::start()
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;
/* 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();
+}
#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"
static Timer random_timer;
static int frame;
-static unsigned int last_update_time;
-static unsigned int update_time;
static GameSession* titlesession;
/* --- 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);
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. */
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 );
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())
{
titlesession->get_current_sector()->activate();
titlesession->set_current();
//titletux.level_begin();
- update_time = Ticks::get();
+ frame_rate.update();
}
}
else if(menu == contrib_menu)
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++;
#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"
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)
draw(context, offset);
get_input();
update(delta);
-
+
if(Menu::current())
{
Menu::current()->draw(context);