X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fmainloop.cpp;h=f291e2807f16ba2f214d7ebfd98212d24d76c04f;hb=c13404a6b6a97ad0d5e1c9f905d7a7e37b797c13;hp=4d32e54ff627200396db98a293f010c1ac3e8545;hpb=eba22158410e664ad102c7542e333d00dcb80cc3;p=supertux.git diff --git a/src/mainloop.cpp b/src/mainloop.cpp index 4d32e54ff..f291e2807 100644 --- a/src/mainloop.cpp +++ b/src/mainloop.cpp @@ -29,18 +29,16 @@ #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 "screen_fade.hpp" #include "timer.hpp" #include "player_status.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 */ @@ -76,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 @@ -123,8 +121,8 @@ 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 @@ -170,6 +168,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); @@ -179,21 +179,53 @@ void MainLoop::process_events() { main_controller->update(); + Uint8* keystate = SDL_GetKeyState(NULL); SDL_Event event; - while(SDL_PollEvent(&event)) { - main_controller->process_event(event); - if(Menu::current() != NULL) - 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(); + while(SDL_PollEvent(&event)) + { + main_controller->process_event(event); + + if(Menu::current() != NULL) + Menu::current()->event(event); + + switch(event.type) + { + case SDL_QUIT: + quit(); + break; + + case SDL_VIDEORESIZE: + Renderer::instance()->resize(event.resize.w, event.resize.h); + Menu::recalc_pos(); + break; + + case SDL_KEYDOWN: + if (event.key.keysym.sym == SDLK_F10) + { + config->show_fps = !config->show_fps; + } + if (event.key.keysym.sym == SDLK_F11) + { + config->use_fullscreen = !config->use_fullscreen; + init_video(); + Menu::recalc_pos(); + } + else if (event.key.keysym.sym == SDLK_PRINT || + event.key.keysym.sym == SDLK_F12) + { + take_screenshot(); + } + else if (event.key.keysym.sym == SDLK_F1 && + (keystate[SDLK_LCTRL] || keystate[SDLK_RCTRL]) && + keystate[SDLK_c]) + { + Console::instance->toggle(); + config->console_enabled = true; + config->save(); + } + break; + } } - } } void @@ -220,9 +252,11 @@ MainLoop::handle_screen_switch() nextpush = false; nextpop = false; speed = 1.0; - if(next_screen.get() != NULL) - next_screen->setup(); - current_screen.reset(next_screen.release()); + Screen* next_screen_ptr = next_screen.release(); + next_screen.reset(0); + if(next_screen_ptr) + next_screen_ptr->setup(); + current_screen.reset(next_screen_ptr); screen_fade.reset(NULL); waiting_threads.wakeup(); @@ -250,7 +284,7 @@ MainLoop::run(DrawingContext &context) 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 + // elapsed_ticks grows extremely large, so we just ignore those // large time jumps elapsed_ticks = 0; }