X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Ftextscroller.cpp;h=20d900ce59303dc0b48ab912cbf2bccace3a21f4;hb=e409aaf88c618c2fc47ff8f9bbe523b8f271c795;hp=1b911b1e13749d98658f0f590a448f851fe30bfb;hpb=90a1a01a554d9d6852809dded1abe3430b9c0c2b;p=supertux.git diff --git a/src/textscroller.cpp b/src/textscroller.cpp index 1b911b1e1..20d900ce5 100644 --- a/src/textscroller.cpp +++ b/src/textscroller.cpp @@ -1,3 +1,22 @@ +// $Id$ +// +// SuperTux +// Copyright (C) 2005 Matthias Braun +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +// 02111-1307, USA. #include #include "textscroller.h" @@ -6,13 +25,12 @@ #include "resources.h" #include "video/font.h" #include "video/drawing_context.h" -#include "app/globals.h" #include "lisp/parser.h" #include "lisp/lisp.h" +#include "main.h" +#include "control/joystickkeyboardcontroller.h" -static const float DEFAULT_SPEED = 1.0; -static const float MAX_VEL = 10; -static const float SPEED_INC = 0.01; +static const float DEFAULT_SPEED = .02; static const float SCROLL = 60; static const float ITEMS_SPACE = 4; @@ -35,19 +53,19 @@ static void split_text(const std::string& text, std::vector& lines) } } -void display_text_file(const std::string& file) +void display_text_file(const std::string& filename) { const Font* heading_font = white_big_text; const Font* normal_font = white_text; const Font* small_font = white_small_text; const Font* reference_font = blue_text; - float speed = DEFAULT_SPEED; + float defaultspeed = DEFAULT_SPEED; + float speed = defaultspeed; std::string text; std::string background_file; std::vector lines; - std::string filename = datadir + "/" + file; lisp::Parser parser; try { std::auto_ptr root (parser.parse(filename)); @@ -60,7 +78,8 @@ void display_text_file(const std::string& file) throw std::runtime_error("file doesn't contain a text field"); if(!text_lisp->get("background", background_file)) throw std::runtime_error("file doesn't contain a background file"); - text_lisp->get("speed", speed); + if(text_lisp->get("speed", defaultspeed)) + defaultspeed /= 50; } catch(std::exception& e) { std::cerr << "Couldn't load file '" << filename << "': " << e.what() << "\n"; @@ -71,114 +90,97 @@ void display_text_file(const std::string& file) split_text(text, lines); // load background image - Surface* background = new Surface( - get_resource_filename("images/background/" + background_file), false); + Surface* background + = new Surface("images/background/" + background_file, false); - int done = 0; + bool done = false; float scroll = 0; - speed /= 50.0; float left_border = 50; DrawingContext context; SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); Uint32 lastticks = SDL_GetTicks(); - while(!done) - { - /* in case of input, exit */ - SDL_Event event; - while(SDL_PollEvent(&event)) - switch(event.type) - { - case SDL_KEYDOWN: - switch(event.key.keysym.sym) - { - case SDLK_UP: - speed -= SPEED_INC; - break; - case SDLK_DOWN: - speed += SPEED_INC; - break; - case SDLK_SPACE: - case SDLK_RETURN: - if(speed >= 0) - scroll += SCROLL; - break; - case SDLK_ESCAPE: - done = 1; - break; - default: - break; - } - break; - case SDL_QUIT: - done = 1; - break; - default: - break; - } - - if(speed > MAX_VEL) - speed = MAX_VEL; - else if(speed < -MAX_VEL) - speed = -MAX_VEL; - - /* draw the credits */ - context.draw_surface(background, Vector(0,0), 0); - - float y = 0; - for(size_t i = 0; i < lines.size(); i++) { - const std::string& line = lines[i]; - if(line.size() == 0) { - y += normal_font->get_height() + ITEMS_SPACE; - continue; - } + while(!done) { + main_controller->update(); + /* in case of input, exit */ + SDL_Event event; + while(SDL_PollEvent(&event)) { + main_controller->process_event(event); + if(event.type == SDL_QUIT) + throw std::runtime_error("received window close"); + } - const Font* font = 0; - bool center = true; - switch(line[0]) - { - case ' ': font = small_font; break; - case '\t': font = normal_font; break; - case '-': font = heading_font; break; - case '*': font = reference_font; break; - case '#': font = normal_font; center = false; break; - default: - std::cerr << "Warning: text contains an unformated line.\n"; - font = normal_font; - center = false; - break; - } - - if(center) { - context.draw_text(font, - line.substr(1, line.size()-1), - Vector(SCREEN_WIDTH/2, SCREEN_HEIGHT + y - scroll), - CENTER_ALLIGN, LAYER_FOREGROUND1); - } else { - context.draw_text(font, - line.substr(1, line.size()-1), - Vector(left_border, SCREEN_HEIGHT + y - scroll), - LEFT_ALLIGN, LAYER_FOREGROUND1); - } - - y += font->get_height() + ITEMS_SPACE; + if(main_controller->hold(Controller::UP)) { + speed = -defaultspeed*5; + } else if(main_controller->hold(Controller::DOWN)) { + speed = defaultspeed*5; + } else { + speed = defaultspeed; + } + if(main_controller->pressed(Controller::JUMP) + || main_controller->pressed(Controller::ACTION) + || main_controller->pressed(Controller::MENU_SELECT)) + scroll += SCROLL; + if(main_controller->pressed(Controller::PAUSE_MENU)) + done = true; + + /* draw the credits */ + context.draw_surface(background, Vector(0,0), 0); + + float y = 0; + for(size_t i = 0; i < lines.size(); i++) { + const std::string& line = lines[i]; + if(line.size() == 0) { + y += normal_font->get_height() + ITEMS_SPACE; + continue; } - - context.do_drawing(); - - if(SCREEN_HEIGHT+y-scroll < 0 && 20+SCREEN_HEIGHT+y-scroll < 0) - done = 1; - - Uint32 ticks = SDL_GetTicks(); - scroll += speed * (ticks - lastticks); - lastticks = ticks; - if(scroll < 0) - scroll = 0; - - SDL_Delay(10); + + const Font* font = 0; + bool center = true; + switch(line[0]) + { + case ' ': font = small_font; break; + case '\t': font = normal_font; break; + case '-': font = heading_font; break; + case '*': font = reference_font; break; + case '#': font = normal_font; center = false; break; + default: + std::cerr << "Warning: text contains an unformated line.\n"; + font = normal_font; + center = false; + break; + } + + if(center) { + context.draw_text(font, + line.substr(1, line.size()-1), + Vector(SCREEN_WIDTH/2, SCREEN_HEIGHT + y - scroll), + CENTER_ALLIGN, LAYER_FOREGROUND1); + } else { + context.draw_text(font, + line.substr(1, line.size()-1), + Vector(left_border, SCREEN_HEIGHT + y - scroll), + LEFT_ALLIGN, LAYER_FOREGROUND1); + } + + y += font->get_height() + ITEMS_SPACE; } - + + context.do_drawing(); + + if(SCREEN_HEIGHT+y-scroll < 0 && 20+SCREEN_HEIGHT+y-scroll < 0) + done = 1; + + Uint32 ticks = SDL_GetTicks(); + scroll += speed * (ticks - lastticks); + lastticks = ticks; + if(scroll < 0) + scroll = 0; + + SDL_Delay(10); + } + SDL_EnableKeyRepeat(0, 0); // disables key repeating delete background; }