diff options
author | Bjørn Lindeijer <bjorn@lindeijer.nl> | 2009-01-24 16:56:01 +0100 |
---|---|---|
committer | Bjørn Lindeijer <bjorn@lindeijer.nl> | 2009-01-24 16:56:01 +0100 |
commit | 944c187b91e823075dd1708b4f575acd43f0428f (patch) | |
tree | d8513a7d1eac88ab6d4abcf9939e89db482c135b | |
parent | 72e65a1cc2f2f9f541d24382eff4a2edb2535e57 (diff) | |
download | mana-944c187b91e823075dd1708b4f575acd43f0428f.tar.gz mana-944c187b91e823075dd1708b4f575acd43f0428f.tar.bz2 mana-944c187b91e823075dd1708b4f575acd43f0428f.tar.xz mana-944c187b91e823075dd1708b4f575acd43f0428f.zip |
Added speech bubble background by QOAL
-rw-r--r-- | data/graphics/gui/bubble.png | bin | 0 -> 407 bytes | |||
-rw-r--r-- | src/being.cpp | 2 | ||||
-rw-r--r-- | src/text.cpp | 71 | ||||
-rw-r--r-- | src/text.h | 7 |
4 files changed, 68 insertions, 12 deletions
diff --git a/data/graphics/gui/bubble.png b/data/graphics/gui/bubble.png Binary files differnew file mode 100644 index 00000000..45322eb2 --- /dev/null +++ b/data/graphics/gui/bubble.png diff --git a/src/being.cpp b/src/being.cpp index b11177e1..5782c423 100644 --- a/src/being.cpp +++ b/src/being.cpp @@ -157,7 +157,7 @@ void Being::setSpeech(const std::string &text, Uint32 time) mSpeech = new Text(text, mPx + X_SPEECH_OFFSET, mPy - Y_SPEECH_OFFSET, gcn::Graphics::CENTER, speechFont, - gcn::Color(255, 255, 255)); + gcn::Color(255, 255, 255), true); mSpeechTime = 500; } diff --git a/src/text.cpp b/src/text.cpp index c0cd1ecc..d256b82d 100644 --- a/src/text.cpp +++ b/src/text.cpp @@ -25,23 +25,50 @@ #include <guichan/font.hpp> +#include "configuration.h" #include "textmanager.h" +#include "resources/resourcemanager.h" +#include "resources/image.h" int Text::mInstances = 0; - +ImageRect Text::mBubble; +Image *Text::mBubbleArrow; Text::Text(const std::string &text, int x, int y, gcn::Graphics::Alignment alignment, gcn::Font *font, - gcn::Color colour) : - mText(text), mColour(colour) + gcn::Color colour, bool isSpeech) : + mText(text), + mColour(colour), + mIsSpeech(isSpeech) { if (textManager == 0) { - textManager = new TextManager(); + textManager = new TextManager; + ResourceManager *resman = ResourceManager::getInstance(); + Image *sbImage = resman->getImage("graphics/gui/bubble.png|W:#" + + config.getValue("speechBubbleColour", "000000")); + mBubble.grid[0] = sbImage->getSubImage(0, 0, 5, 5); + mBubble.grid[1] = sbImage->getSubImage(5, 0, 5, 5); + mBubble.grid[2] = sbImage->getSubImage(10, 0, 5, 5); + mBubble.grid[3] = sbImage->getSubImage(0, 5, 5, 5); + mBubble.grid[4] = sbImage->getSubImage(5, 5, 5, 5); + mBubble.grid[5] = sbImage->getSubImage(10, 5, 5, 5); + mBubble.grid[6] = sbImage->getSubImage(0, 10, 5, 5); + mBubble.grid[7] = sbImage->getSubImage(5, 10, 5, 5); + mBubble.grid[8] = sbImage->getSubImage(10, 10, 5, 5); + mBubbleArrow = sbImage->getSubImage(0, 15, 15, 10); + double bubbleAlpha = config.getValue("speechBubbleAlpha", 0.4); + for (int i = 0; i < 9; i++) + { + mBubble.grid[i]->setAlpha(bubbleAlpha); + } + mBubbleArrow->setAlpha(bubbleAlpha); + sbImage->decRef(); } ++mInstances; mHeight = font->getHeight(); mWidth = font->getWidth(text); + switch (alignment) { case gcn::Graphics::LEFT: @@ -60,11 +87,6 @@ Text::Text(const std::string &text, int x, int y, mFont = font; } -void Text::adviseXY(int x, int y) -{ - textManager->moveText(this, x - mXOffset, y); -} - Text::~Text() { textManager->removeText(this); @@ -72,14 +94,43 @@ Text::~Text() { delete textManager; textManager = 0; + delete mBubble.grid[0]; + delete mBubble.grid[1]; + delete mBubble.grid[2]; + delete mBubble.grid[3]; + delete mBubble.grid[4]; + delete mBubble.grid[5]; + delete mBubble.grid[6]; + delete mBubble.grid[7]; + delete mBubble.grid[8]; + delete mBubbleArrow; } } +void Text::adviseXY(int x, int y) +{ + textManager->moveText(this, x - mXOffset, y); +} + void Text::draw(Graphics *graphics, int xOff, int yOff) { graphics->setFont(mFont); graphics->setColor(mColour); - graphics->drawText(mText, mX - xOff, mY - yOff, gcn::Graphics::LEFT); + + if (mIsSpeech) { + static_cast<Graphics*>(graphics)->drawImageRect( + mX - xOff - 5, mY - yOff - 5, mWidth + 10, mHeight + 10, + mBubble); + + if (mWidth >= 15) { + static_cast<Graphics*>(graphics)->drawImage( + mBubbleArrow, mX - xOff - 7 + mWidth / 2, + mY - yOff + mHeight + 4); + } + } + + graphics->drawText(mText, mX - xOff, mY - yOff, + gcn::Graphics::LEFT); } FlashText::FlashText(const std::string &text, int x, int y, @@ -38,7 +38,7 @@ class Text */ Text(const std::string &text, int x, int y, gcn::Graphics::Alignment alignment, gcn::Font *font, - gcn::Color colour); + gcn::Color colour, bool isSpeech = false); /** * Destructor. The text is removed from the screen. @@ -65,6 +65,11 @@ class Text gcn::Font *mFont; /**< The font used. */ std::string mText; /**< The text to display. */ gcn::Color mColour; /**< The colour of the text. */ + bool mIsSpeech; /**< Is this text a speech bubble? */ + + protected: + static ImageRect mBubble; /**< Speech bubble graphic */ + static Image *mBubbleArrow; /**< Speech bubble arrow graphic */ }; class FlashText : public Text |