diff --git a/Win32/Unuk/LibUnuk/LibUnuk.vcproj b/Win32/Unuk/LibUnuk/LibUnuk.vcproj index 171c9e2..075a7c6 100644 --- a/Win32/Unuk/LibUnuk/LibUnuk.vcproj +++ b/Win32/Unuk/LibUnuk/LibUnuk.vcproj @@ -269,6 +269,14 @@ RelativePath="..\..\..\src\libUnuk\MapTile.h" > + + + + diff --git a/src/Unuk/Player.cpp b/src/Unuk/Player.cpp index c49b686..af84aa6 100644 --- a/src/Unuk/Player.cpp +++ b/src/Unuk/Player.cpp @@ -57,7 +57,7 @@ void Player::HandleInput(void) { void Player::Update(void) { Move(); - AddSpeachBubble("Woot, My name is Allanis, welcome to my home"); + AddSpeachBubble("Woot, My name is Allanis\n, welcome to my home"); // For now The camera will be static. SetCamera(); diff --git a/src/libUnuk/Text.cpp b/src/libUnuk/Text.cpp index fad9cd6..5341714 100644 --- a/src/libUnuk/Text.cpp +++ b/src/libUnuk/Text.cpp @@ -6,14 +6,21 @@ TTF_Font* Text::mediumFont = NULL; TTF_Font* Text::largeFont = NULL; TTF_Font* Text::vLargeFont = NULL; +const static int lineSpacing = 3; + Text::Text(void) { - _text = NULL; + x=0; + y=0; + w=0; + h=0; } Text::~Text(void) { - if (_text) { - SDL_FreeSurface(_text); - _text = NULL; + if(!_lines.empty()) { + for(std::list::iterator it = _lines.begin(); it != _lines.end(); ++it) { + SDL_FreeSurface(*it); + } + _lines.clear(); } } @@ -55,29 +62,83 @@ void Text::SetXY(int xArg, int yArg) { int Text::SetTextBlended(string textArg, textSizes_t size, SDL_Color colour) { _textContents = textArg; - if(_text != NULL) { - SDL_FreeSurface(_text); + if(!_lines.empty()) { + for(std::list::iterator it = _lines.begin(); it != _lines.end(); ++it) { + SDL_FreeSurface(*it); + } + _lines.clear(); + } + + std::list lines; + std::string line; + for(int i = 0; i < (int)textArg.size(); i++) { + char c = textArg.at(i); + if(c=='\n') { + lines.push_back(line); + line.clear(); + } else { + line += c; + } + } + if (!line.empty()) { + lines.push_back(line); } - if(size == vsmall) { - _text = TTF_RenderText_Blended(vSmallFont, textArg.c_str(), colour); - return 1; - } - else if(size == small) { - _text = TTF_RenderText_Blended(smallFont, textArg.c_str(), colour); - return 1; - } - else if(size == medium) { - _text = TTF_RenderText_Blended(mediumFont, textArg.c_str(), colour); - return 1; - } - else if(size == large) { - _text = TTF_RenderText_Blended(largeFont, textArg.c_str(), colour); - return 1; - } else { - _text = TTF_RenderText_Blended(vLargeFont, textArg.c_str(), colour); - return 1; + for(std::list::iterator it = lines.begin(); it != lines.end(); ++it) { + SDL_Surface* lineSurf = NULL; + if(size == vsmall) { + lineSurf = TTF_RenderText_Blended(vSmallFont, textArg.c_str(), colour); + int linePixelWidth; + int linePixelHeight; + TTF_SizeText(vSmallFont, textArg.c_str(), &linePixelWidth, &linePixelHeight); + if(linePixelWidth > w) { + w = linePixelWidth; + } + h += linePixelHeight + lineSpacing; + } + else if(size == small) { + lineSurf = TTF_RenderText_Blended(smallFont, it->c_str(), colour); + int linePixelWidth; + int linePixelHeight; + TTF_SizeText(smallFont, it->c_str(), &linePixelWidth, &linePixelHeight); + if(linePixelWidth > w) { + w = linePixelWidth; + } + h += linePixelHeight + lineSpacing; + } + else if(size == medium) { + lineSurf = TTF_RenderText_Blended(mediumFont, it->c_str(), colour); + int linePixelWidth; + int linePixelHeight; + TTF_SizeText(mediumFont, it->c_str(), &linePixelWidth, &linePixelHeight); + if(linePixelWidth > w) { + w = linePixelWidth; + } + h += linePixelHeight + lineSpacing; + } + else if(size == large) { + lineSurf = TTF_RenderText_Blended(largeFont, it->c_str(), colour); + int linePixelWidth; + int linePixelHeight; + TTF_SizeText(largeFont, it->c_str(), &linePixelWidth, &linePixelHeight); + if(linePixelWidth > w) { + w = linePixelWidth; + } + h += linePixelHeight + lineSpacing; + } else { + lineSurf = TTF_RenderText_Blended(vLargeFont, it->c_str(), colour); + int linePixelWidth; + int linePixelHeight; + TTF_SizeText(vLargeFont, it->c_str(), &linePixelWidth, &linePixelHeight); + if(linePixelWidth > w) { + w = linePixelWidth; + } + h += linePixelHeight + lineSpacing; + } + _lines.push_back(lineSurf); + } + return 1; } int Text::SetTextBlended(string textArg, textSizes_t size, Uint8 r, Uint8 g, Uint8 b) { @@ -88,29 +149,82 @@ int Text::SetTextBlended(string textArg, textSizes_t size, Uint8 r, Uint8 g, Uin int Text::SetTextShaded(string textArg, textSizes_t size, SDL_Color colour, SDL_Color bgColour) { _textContents = textArg; - if(_text != NULL) { - SDL_FreeSurface(_text); + if(!_lines.empty()) { + for(std::list::iterator it = _lines.begin(); it != _lines.end(); ++it) { + SDL_FreeSurface(*it); + } + _lines.clear(); } - if(size == vsmall) { - _text = TTF_RenderText_Shaded(vSmallFont, textArg.c_str(), colour, bgColour); - return 1; + std::list lines; + std::string line; + for(int i = 0; i < (int)textArg.size(); i++) { + char c = textArg.at(i); + if(c=='\n') { + lines.push_back(line); + line.clear(); + } else { + line += c; + } } - else if(size == small) { - _text = TTF_RenderText_Shaded(smallFont, textArg.c_str(), colour, bgColour); - return 1; + if (!line.empty()) { + lines.push_back(line); } - else if(size == medium) { - _text = TTF_RenderText_Shaded(mediumFont, textArg.c_str(), colour, bgColour); - return 1; - } - else if(size == large) { - _text = TTF_RenderText_Shaded(largeFont, textArg.c_str(), colour, bgColour); - return 1; - } else { - _text = TTF_RenderText_Shaded(vLargeFont, textArg.c_str(), colour, bgColour); - return 1; + + for(std::list::iterator it = lines.begin(); it != lines.end(); ++it) { + SDL_Surface* lineSurf; + if(size == vsmall) { + lineSurf = TTF_RenderText_Shaded(vSmallFont, it->c_str(), colour, bgColour); + int linePixelWidth; + int linePixelHeight; + TTF_SizeText(vSmallFont, it->c_str(), &linePixelWidth, &linePixelHeight); + if(linePixelWidth > w) { + w = linePixelWidth; + } + h += linePixelHeight + lineSpacing; + } + else if(size == small) { + lineSurf = TTF_RenderText_Shaded(smallFont, it->c_str(), colour, bgColour); + int linePixelWidth; + int linePixelHeight; + TTF_SizeText(smallFont, it->c_str(), &linePixelWidth, &linePixelHeight); + if(linePixelWidth > w) { + w = linePixelWidth; + } + h += linePixelHeight + lineSpacing; + } + else if(size == medium) { + lineSurf = TTF_RenderText_Shaded(mediumFont, it->c_str(), colour, bgColour); + int linePixelWidth; + int linePixelHeight; + TTF_SizeText(mediumFont, it->c_str(), &linePixelWidth, &linePixelHeight); + if(linePixelWidth > w) { + w = linePixelWidth; + } + h += linePixelHeight + lineSpacing; + } + else if(size == large) { + lineSurf = TTF_RenderText_Shaded(largeFont, it->c_str(), colour, bgColour); + int linePixelWidth; + int linePixelHeight; + TTF_SizeText(largeFont, it->c_str(), &linePixelWidth, &linePixelHeight); + if(linePixelWidth > w) { + w = linePixelWidth; + } + h += linePixelHeight + lineSpacing; + } else { + lineSurf = TTF_RenderText_Shaded(vLargeFont, it->c_str(), colour, bgColour); + int linePixelWidth; + int linePixelHeight; + TTF_SizeText(vLargeFont, it->c_str(), &linePixelWidth, &linePixelHeight); + if(linePixelWidth > w) { + w = linePixelWidth; + } + h += linePixelHeight + lineSpacing; + } + _lines.push_back(lineSurf); } + return 1; } int Text::SetTextShaded(string textArg, textSizes_t size, Uint8 rF, Uint8 gF, Uint8 bF, Uint8 rB, Uint8 gB, Uint8 bB) { @@ -120,17 +234,37 @@ int Text::SetTextShaded(string textArg, textSizes_t size, Uint8 rF, Uint8 gF, Ui } void Text::Render(void) { - ApplySurface(x, y, _text, screen); + int yOffset = 0; + for(std::list::iterator it = _lines.begin(); it != _lines.end(); ++it) { + SDL_Surface* lineSurf = *it; + ApplySurface(x, y + yOffset, lineSurf, screen); + yOffset += lineSurf->h + lineSpacing; + } } void Text::Render(int xArg, int yArg) { - ApplySurface(xArg, yArg, _text, screen); + int yOffset = 0; + for(std::list::iterator it = _lines.begin(); it != _lines.end(); ++it) { + SDL_Surface* lineSurf = *it; + ApplySurface(x + xArg, y + yArg + yOffset, lineSurf, screen); + yOffset += lineSurf->h + lineSpacing; + } } void Text::RenderLiteral(void) { - ApplySurfaceLiteral(x, y, _text, screen); + int yOffset = 0; + for(std::list::iterator it = _lines.begin(); it != _lines.end(); ++it) { + SDL_Surface* lineSurf = *it; + ApplySurfaceLiteral(x, y + yOffset, lineSurf, screen); + yOffset += lineSurf->h + lineSpacing; + } } void Text::RenderLiteral(int xArg, int yArg) { - ApplySurfaceLiteral(xArg, yArg, _text, screen); + int yOffset = 0; + for(std::list::iterator it = _lines.begin(); it != _lines.end(); ++it) { + SDL_Surface* lineSurf = *it; + ApplySurfaceLiteral(x + xArg, y + yArg + yOffset, lineSurf, screen); + yOffset += lineSurf->h + lineSpacing; + } } diff --git a/src/libUnuk/Text.h b/src/libUnuk/Text.h index 6a87dfa..fa6c4bb 100644 --- a/src/libUnuk/Text.h +++ b/src/libUnuk/Text.h @@ -3,6 +3,7 @@ #include #include #include +#include #include "../Unuk/Globals.h" #include "ApplySurface.h" @@ -20,8 +21,8 @@ public: static void LoadFonts(void); static void FreeFonts(void); - int GetWidth(void) { return _text->w; } - int GetHeight(void) { return _text->h; } + int GetWidth(void) { return w; } + int GetHeight(void) { return h; } int GetX(void) { return x; } int GetY(void) { return y; } @@ -46,7 +47,7 @@ private: string _textContents; SDL_Color _textColour; - SDL_Surface* _text; + std::list _lines; static TTF_Font* vSmallFont; static TTF_Font* smallFont;