From 2728d18a492273475c326a952fe40f8cb317a6b1 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Ond=C5=99ej=20Ho=C5=A1ek?= Date: Wed, 26 Oct 2005 12:16:09 +0000 Subject: [PATCH] * Added image support to InfoBlocks (useful e.g. to show a picture of the power-up before describing it) * Added scrolling support to InfoBlocks (we'll need an up and a down arrow image to display when scrolling can be performed) SVN-Revision: 2918 --- src/game_session.cpp | 4 ++++ src/object/infoblock.cpp | 2 +- src/textscroller.cpp | 33 ++++++++++++++++++++++++++++----- src/textscroller.hpp | 4 ++++ 4 files changed, 37 insertions(+), 6 deletions(-) diff --git a/src/game_session.cpp b/src/game_session.cpp index 247991e33..65ce7c479 100644 --- a/src/game_session.cpp +++ b/src/game_session.cpp @@ -683,6 +683,10 @@ GameSession::display_info_box(const std::string& text) || main_controller->pressed(Controller::PAUSE_MENU) || main_controller->pressed(Controller::MENU_SELECT)) running = false; + else if(main_controller->pressed(Controller::DOWN)) + box->scrolldown(); + else if(main_controller->pressed(Controller::UP)) + box->scrollup(); box->draw(*context); draw(); sound_manager->update(); diff --git a/src/object/infoblock.cpp b/src/object/infoblock.cpp index 931ff343c..1008c0790 100644 --- a/src/object/infoblock.cpp +++ b/src/object/infoblock.cpp @@ -51,12 +51,12 @@ InfoBlock::~InfoBlock() void InfoBlock::hit(Player& ) { - GameSession::current()->display_info_box(message); start_bounce(); if (!stopped) { ringing->remove_me(); stopped = true; } + GameSession::current()->display_info_box(message); } IMPLEMENT_FACTORY(InfoBlock, "infoblock") diff --git a/src/textscroller.cpp b/src/textscroller.cpp index 176ecab6f..2e036879a 100644 --- a/src/textscroller.cpp +++ b/src/textscroller.cpp @@ -220,10 +220,22 @@ InfoBox::InfoBox(const std::string& text) : firstline(0) { split_text(text, lines); + + for(size_t i = 0; i < lines.size(); ++i) { + if(lines[i].size() == 0) + continue; + if(lines[i][0] == '!') { + std::string imagename = lines[i].substr(1, lines[i].size()-1); + images.insert(std::make_pair(imagename, new Surface(imagename))); + } + } } InfoBox::~InfoBox() { + for(std::map::iterator i = images.begin(); + i != images.end(); ++i) + delete i->second; } void @@ -254,6 +266,7 @@ InfoBox::draw(DrawingContext& context) } const Font* font = 0; + const Surface* image = 0; bool center = true; switch(line[0]) { @@ -262,26 +275,36 @@ InfoBox::draw(DrawingContext& context) case '-': font = heading_font; break; case '*': font = reference_font; break; case '#': font = normal_font; center = false; break; + case '!': { + std::string imagename = line.substr(1, line.size()-1); + image = images[imagename]; + break; + } default: - std::cerr << "Warning: text contains an unformated line.\n"; + std::cerr << "Warning: text contains an unformatted line.\n"; font = normal_font; center = false; break; } - if(center) { + if(image != 0) { + context.draw_surface(image, + Vector( (SCREEN_WIDTH - image->get_width()) / 2, + y), LAYER_GUI); + y += image->get_height() + ITEMS_SPACE; + } else if(center) { context.draw_text(font, line.substr(1, line.size()-1), Vector(SCREEN_WIDTH/2, y), CENTER_ALLIGN, LAYER_GUI); + y += font->get_height() + ITEMS_SPACE; } else { context.draw_text(font, line.substr(1, line.size()-1), Vector(x1, y), LEFT_ALLIGN, LAYER_GUI); - } - - y += font->get_height() + ITEMS_SPACE; + y += font->get_height() + ITEMS_SPACE; + } } } diff --git a/src/textscroller.hpp b/src/textscroller.hpp index 924b3c6ae..01615c173 100644 --- a/src/textscroller.hpp +++ b/src/textscroller.hpp @@ -23,6 +23,9 @@ #include #include +#include + +#include "video/surface.hpp" class DrawingContext; @@ -43,6 +46,7 @@ public: private: size_t firstline; std::vector lines; + std::map images; }; /** Reads a text file (using LispReader, so it as to be in its formatting) -- 2.11.0