X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fmainloop.cpp;h=e5db0246a58eb0e4e3d16a0a6335d01a1fa1a374;hb=665b4a4a6b0edae82fb830528f16d2176da44aa4;hp=2001a143a9748109ce30cf489dbe7456f9449546;hpb=7fbc38d9c2fda9bfb10eeb7ecb3db36c3daa2824;p=supertux.git diff --git a/src/mainloop.cpp b/src/mainloop.cpp index 2001a143a..e5db0246a 100644 --- a/src/mainloop.cpp +++ b/src/mainloop.cpp @@ -49,7 +49,7 @@ static const int MAX_FRAME_SKIP = 2; MainLoop* main_loop = NULL; MainLoop::MainLoop() - : speed(1.0), nextpop(false), nextpush(false) + : speed(1.0), nextpop(false), nextpush(false), fps(0), screenshot_requested(false) { using namespace Scripting; TimeScheduler::instance = new TimeScheduler(); @@ -109,14 +109,20 @@ MainLoop::set_speed(float speed) this->speed = speed; } +float +MainLoop::get_speed() const +{ + return speed; +} + 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), LEFT_ALLIGN, LAYER_HUD); - context.draw_text(gold_text, str, Vector(SCREEN_WIDTH - BORDER_X, BORDER_Y + 20), RIGHT_ALLIGN, LAYER_HUD); + 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); } void @@ -135,6 +141,11 @@ MainLoop::draw(DrawingContext& context) if(config->show_fps) draw_fps(context, fps); + // if a screenshot was requested, pass request on to drawing_context + if (screenshot_requested) { + context.take_screenshot(); + screenshot_requested = false; + } context.do_drawing(); /* Calculate frames per second */ @@ -173,6 +184,13 @@ MainLoop::process_events() Menu::current()->event(event); if(event.type == SDL_QUIT) quit(); + else if (event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_F11) { + config->use_fullscreen = !config->use_fullscreen; + init_video(); + } + else if (event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_PRINT) { + take_screenshot(); + } } } @@ -210,13 +228,10 @@ MainLoop::handle_screen_switch() } void -MainLoop::run() +MainLoop::run(DrawingContext &context) { - DrawingContext context; - - Uint32 last_ticks; + Uint32 last_ticks = 0; Uint32 elapsed_ticks = 0; - int skipped_frames = 0; running = true; while(running) { @@ -229,34 +244,40 @@ MainLoop::run() elapsed_ticks += ticks - last_ticks; last_ticks = ticks; - /* time for a new logical frame? */ - if(elapsed_ticks > TICKS_PER_FRAME) { - elapsed_ticks -= TICKS_PER_FRAME; - float timestep = 1.0 / LOGICAL_FPS; - real_time += timestep; - timestep *= speed; - game_time += timestep; - - process_events(); - update_gamelogic(timestep); + if (elapsed_ticks > TICKS_PER_FRAME*4) { + // when the game loads up or levels are switched the + // elapsed_ticks grows extremly large, so we just ignore those + // large time jumps + elapsed_ticks = 0; } - if(elapsed_ticks > TICKS_PER_FRAME) { - // too much time passed since last frame, the computer doesn't seem to be - // able to draw 64fps on screen, so skip 1 frame for now - skipped_frames++; + int frames = 0; - // slow down the game if we skip too many frames - if(skipped_frames > MAX_FRAME_SKIP) { - elapsed_ticks = elapsed_ticks % TICKS_PER_FRAME; - draw(context); - skipped_frames = 0; + if (elapsed_ticks > TICKS_PER_FRAME) { + 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; } - } else { + draw(context); - skipped_frames = 0; } sound_manager->update(); + + SDL_Delay(0); } } + +void +MainLoop::take_screenshot() +{ + screenshot_requested = true; +} +