X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fgameloop.cpp;h=d523bdaff17ba538b3268e1985de4f4932ea7aa6;hb=6074972382238a94397b649650738daf0d869775;hp=685eef3ac245e7caa42ec57f65f5347bed41abcc;hpb=b8780990aa3c3936a69547296b930a6f5aaf74b8;p=supertux.git diff --git a/src/gameloop.cpp b/src/gameloop.cpp index 685eef3ac..d523bdaff 100644 --- a/src/gameloop.cpp +++ b/src/gameloop.cpp @@ -58,7 +58,7 @@ GameSession* GameSession::current_ = 0; GameSession::GameSession(const std::string& subset_, int levelnb_, int mode) - : world(0), st_gl_mode(mode), levelnb(levelnb_), end_sequenze(false), + : world(0), st_gl_mode(mode), levelnb(levelnb_), end_sequence(false), subset(subset_) { current_ = this; @@ -77,7 +77,7 @@ GameSession::restart_level() { game_pause = false; exit_status = NONE; - end_sequenze = false; + end_sequence = false; fps_timer.init(true); frame_timer.init(true); @@ -121,7 +121,6 @@ GameSession::restart_level() world->get_tux()->base.y = best_reset_point.y; } } - if (st_gl_mode != ST_GL_DEMO_GAME) { @@ -149,7 +148,7 @@ GameSession::levelintro(void) if (get_level()->img_bkgd) get_level()->img_bkgd->draw(0, 0); else - clearscreen(0, 0, 0); + drawgradient(get_level()->bkgd_top, get_level()->bkgd_bottom); sprintf(str, "%s", world->get_level()->name.c_str()); gold_text->drawf(str, 0, 200, A_HMIDDLE, A_TOP, 1); @@ -158,7 +157,7 @@ GameSession::levelintro(void) white_text->drawf(str, 0, 224, A_HMIDDLE, A_TOP, 1); sprintf(str, "by %s", world->get_level()->author.c_str()); - white_small_text->drawf(str, 0, 400, A_HMIDDLE, A_TOP, 1); + white_small_text->drawf(str, 0, 360, A_HMIDDLE, A_TOP, 1); flipscreen(); @@ -195,7 +194,7 @@ GameSession::on_escape_press() void GameSession::process_events() { - if (end_sequenze) + if (end_sequence) { Player& tux = *world->get_tux(); @@ -209,6 +208,43 @@ GameSession::process_events() tux.input.up = UP; last_x_pos = tux.base.x; + + SDL_Event event; + while (SDL_PollEvent(&event)) + { + /* Check for menu-events, if the menu is shown */ + if (Menu::current()) + { + Menu::current()->event(event); + st_pause_ticks_start(); + } + + switch(event.type) + { + case SDL_QUIT: /* Quit event - quit: */ + st_abort("Received window close", ""); + break; + + case SDL_KEYDOWN: /* A keypress! */ + { + SDLKey key = event.key.keysym.sym; + + switch(key) + { + case SDLK_ESCAPE: /* Escape: Open/Close the menu: */ + on_escape_press(); + break; + default: + break; + } + } + + case SDL_JOYBUTTONDOWN: + if (event.jbutton.button == joystick_keymap.start_button) + on_escape_press(); + break; + } + } } else { @@ -378,13 +414,13 @@ GameSession::check_end_conditions() Player* tux = world->get_tux(); /* End of level? */ - if (tux->base.x >= World::current()->get_level()->endpos + 320) + if (tux->base.x >= World::current()->get_level()->endpos + 32 * (get_level()->use_endsequence ? 22 : 10)) { exit_status = LEVEL_FINISHED; } - else if (tux->base.x >= World::current()->get_level()->endpos && !end_sequenze) + else if (tux->base.x >= World::current()->get_level()->endpos && !end_sequence) { - end_sequenze = true; + end_sequence = true; last_x_pos = -1; music_manager->halt_music(); } @@ -491,8 +527,8 @@ GameSession::run() update_time = last_update_time = st_get_ticks(); /* Clear screen: */ - clearscreen(0, 0, 0); - updatescreen(); +// clearscreen(0, 0, 0); +// updatescreen(); // Eat unneeded events SDL_Event event; @@ -528,7 +564,7 @@ GameSession::run() while (frame_ratio > 0) { // Update the world - if (end_sequenze) + if (end_sequence) action(.5f); else action(1.0f); @@ -599,9 +635,6 @@ GameSession::run() } } - delete world; - world = 0; - return exit_status; } @@ -640,7 +673,18 @@ GameSession::drawstatus() white_text->draw("COINS", screen->h, 0, 1); gold_text->draw(str, 608, 0, 1); - white_text->draw("LIVES", screen->h, 20, 1); + white_text->draw("LIVES", 480, 20); + if (player_status.lives >= 5) + { + sprintf(str, "%dx", player_status.lives); + gold_text->draw(str, 585, 20); + tux_life->draw(565+(18*3), 20); + } + else + { + for(int i= 0; i < player_status.lives; ++i) + tux_life->draw(565+(18*i),20); + } if(show_fps) { @@ -648,11 +692,6 @@ GameSession::drawstatus() white_text->draw("FPS", screen->h, 40, 1); gold_text->draw(str, screen->h + 60, 40, 1); } - - for(int i= 0; i < player_status.lives; ++i) - { - tux_life->draw(565+(18*i),20); - } } void @@ -663,7 +702,7 @@ GameSession::drawendscreen() if (get_level()->img_bkgd) get_level()->img_bkgd->draw(0, 0); else - clearscreen(0, 0, 0); + drawgradient(get_level()->bkgd_top, get_level()->bkgd_bottom); blue_text->drawf("GAMEOVER", 0, 200, A_HMIDDLE, A_TOP, 1); @@ -687,7 +726,7 @@ GameSession::drawresultscreen(void) if (get_level()->img_bkgd) get_level()->img_bkgd->draw(0, 0); else - clearscreen(0, 0, 0); + drawgradient(get_level()->bkgd_top, get_level()->bkgd_bottom); blue_text->drawf("Result:", 0, 200, A_HMIDDLE, A_TOP, 1); @@ -707,10 +746,24 @@ std::string slotinfo(int slot) { char tmp[1024]; char slotfile[1024]; + std::string title; sprintf(slotfile,"%s/slot%d.stsg",st_save_dir,slot); + lisp_object_t* savegame = lisp_read_from_file(slotfile); + if (savegame) + { + LispReader reader(lisp_cdr(savegame)); + reader.read_string("title", &title); + lisp_free(savegame); + } + if (access(slotfile, F_OK) == 0) - sprintf(tmp,"Slot %d - Savegame",slot); + { + if (!title.empty()) + snprintf(tmp,1024,"Slot %d - %s",slot, title.c_str()); + else + snprintf(tmp, 1024,"Slot %d - Savegame",slot); + } else sprintf(tmp,"Slot %d - Free",slot);