X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fobject%2Finfoblock.cpp;h=1359ddef53279be40a5603bc15e4ffec0b73be38;hb=c94f71a53fc081a0b2a4c8bf87a2fa0830821bcc;hp=770d69c3f5d0be4a369541daf88e25871648da7d;hpb=9e996e1eaca344660c9fed91abf44566a4cbe8d5;p=supertux.git diff --git a/src/object/infoblock.cpp b/src/object/infoblock.cpp index 770d69c3f..1359ddef5 100644 --- a/src/object/infoblock.cpp +++ b/src/object/infoblock.cpp @@ -28,6 +28,14 @@ #include "sector.hpp" #include "log.hpp" #include "object/player.hpp" +#include "main.hpp" + +namespace { + const float SCROLL_DELAY = 0.5; + const float SCROLL_DISTANCE = 16; + const float WIDTH = 400; + const float HEIGHT = 200; +} InfoBlock::InfoBlock(const lisp::Lisp& lisp) : Block(sprite_manager->create("images/objects/bonus_block/infoblock.sprite")), shown_pct(0), dest_pct(0) @@ -43,17 +51,24 @@ InfoBlock::InfoBlock(const lisp::Lisp& lisp) //stopped = false; //ringing = new AmbientSound(get_pos(), 0.5, 300, 1, "sounds/phone.wav"); //Sector::current()->add_object(ringing); - infoBox.reset(new InfoBox(message)); + + // Split text string lines into a vector + lines = InfoBoxLine::split(message, 400); + lines_height = 0; + for(size_t i = 0; i < lines.size(); ++i) lines_height+=lines[i]->get_height(); } InfoBlock::~InfoBlock() { + for(std::vector::iterator i = lines.begin(); i != lines.end(); i++) { + delete *i; + } } void -InfoBlock::hit(Player& ) +InfoBlock::hit(Player& player) { - start_bounce(); + start_bounce(&player); //if (!stopped) { // ringing->remove_me(); @@ -96,9 +111,11 @@ InfoBlock::get_nearest_player() void InfoBlock::update(float delta) { + Block::update(delta); + if (delta == 0) return; - // hide message if player is too far away + // hide message if player is too far away or above infoblock if (dest_pct > 0) { Player* player = get_nearest_player(); if (player) { @@ -106,7 +123,7 @@ InfoBlock::update(float delta) Vector p2 = player->get_pos() + (player->get_bbox().p2 - player->get_bbox().p1) / 2; Vector dist = (p2 - p1); float d = dist.norm(); - if (d > 128) dest_pct = 0; + if (d > 128 || dist.y < 0) dest_pct = 0; } } @@ -122,13 +139,38 @@ InfoBlock::draw(DrawingContext& context) { Block::draw(context); - if (shown_pct > 0) { - context.push_transform(); - context.set_translation(Vector(0, 0)); - context.set_alpha(shown_pct); - infoBox->draw(context); - context.pop_transform(); + if (shown_pct <= 0) return; + + context.push_transform(); + //context.set_translation(Vector(0, 0)); + context.set_alpha(shown_pct); + + //float x1 = SCREEN_WIDTH/2-200; + //float y1 = SCREEN_HEIGHT/2-200; + float border = 8; + float width = 400; // this is the text width only + float height = lines_height; // this is the text height only + float x1 = (get_bbox().p1.x + get_bbox().p2.x)/2 - width/2; + float x2 = (get_bbox().p1.x + get_bbox().p2.x)/2 + width/2; + float y1 = original_y - height; + + // lines_height includes one ITEMS_SPACE too much, so the bottom border is reduced by 4px + context.draw_filled_rect(Vector(x1-border, y1-border), Vector(width+2*border, height+2*border-4), Color(0.6f, 0.7f, 0.8f, 0.5f), LAYER_GUI-50); + + float y = y1; + for(size_t i = 0; i < lines.size(); ++i) { + if(y >= y1 + height) { + //log_warning << "Too many lines of text in InfoBlock" << std::endl; + //dest_pct = 0; + //shown_pct = 0; + break; + } + + lines[i]->draw(context, Rect(x1, y, x2, y), LAYER_GUI-50+1); + y += lines[i]->get_height(); } + + context.pop_transform(); } void