* Added image support to InfoBlocks (useful e.g. to show a picture of the power-up...
authorOndřej Hošek <ondra.hosek@gmail.com>
Wed, 26 Oct 2005 12:16:09 +0000 (12:16 +0000)
committerOndřej Hošek <ondra.hosek@gmail.com>
Wed, 26 Oct 2005 12:16:09 +0000 (12:16 +0000)
* 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
src/object/infoblock.cpp
src/textscroller.cpp
src/textscroller.hpp

index 247991e..65ce7c4 100644 (file)
@@ -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();
index 931ff34..1008c07 100644 (file)
@@ -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")
index 176ecab..2e03687 100644 (file)
@@ -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<std::string, Surface*>::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;
+    }   
   }
 }
 
index 924b3c6..01615c1 100644 (file)
@@ -23,6 +23,9 @@
 
 #include <vector>
 #include <string>
+#include <map>
+
+#include "video/surface.hpp"
 
 class DrawingContext;
 
@@ -43,6 +46,7 @@ public:
 private:
   size_t firstline;
   std::vector<std::string> lines;
+  std::map<std::string, Surface*> images;
 };
 
 /** Reads a text file (using LispReader, so it as to be in its formatting)