From 19b2b1dde25885ada99deefe79266c2e22376e85 Mon Sep 17 00:00:00 2001 From: Clyne Sullivan Date: Fri, 22 Sep 2017 08:47:14 -0400 Subject: [PATCH] new font; dialog box word wrap... finally --- include/font.hpp | 6 +++++ include/ui.hpp | 2 +- include/vector2.hpp | 17 +++++++++++-- src/engine.cpp | 2 +- src/font.cpp | 5 ++-- src/render.cpp | 2 +- src/ui.cpp | 57 +++++++++++++++++++++++++------------------- src/ui_menu.cpp | 6 ++--- ttf/Janyk.ttf | Bin 0 -> 14032 bytes 9 files changed, 63 insertions(+), 34 deletions(-) create mode 100644 ttf/Janyk.ttf diff --git a/include/font.hpp b/include/font.hpp index 0a6e38b..20d27be 100644 --- a/include/font.hpp +++ b/include/font.hpp @@ -51,6 +51,9 @@ public: FT_Done_FreeType(ftLibrary); } + constexpr static inline int SizeSmall = 16; + constexpr static inline int SizeLarge = 24; + static void init(const std::string& ttf); static void setFontSize(int size); static void setFontColor(float r, float g, float b); @@ -65,6 +68,9 @@ public: static inline auto& getFont(void) { return fontData.at(currentSize); } + + static inline auto getCharWidth(char c) + { return fontData.at(currentSize)[c - 33].wh.x; } }; #endif // FONT_HPP_ diff --git a/include/ui.hpp b/include/ui.hpp index 61c06cf..70f3b80 100644 --- a/include/ui.hpp +++ b/include/ui.hpp @@ -83,7 +83,7 @@ public: */ static void putText(const vec2& p, const std::string& s, ...); - static void putString(const vec2& p, const std::string& s, float wrap = 0.12345f); + static void putString(const vec2& p, const std::string& s, float wrap = 0); static float putStringCentered(const vec2& p, const std::string& s, bool print = true); static void dialogBox(const std::string& n, const std::string& s, ...); diff --git a/include/vector2.hpp b/include/vector2.hpp index 5c9f9e1..54b0809 100644 --- a/include/vector2.hpp +++ b/include/vector2.hpp @@ -4,6 +4,9 @@ #include #include +#include +#include + template struct vector2 { static_assert(std::is_arithmetic::value, "vector2 members must be an arithmetic type (i.e. numbers)"); @@ -123,8 +126,18 @@ struct vector2 { } // other functions - std::string toString(void) const { - return "(" + std::to_string(x) + ", " + std::to_string(y) + ")"; + std::string toString(int precision = -1) const { + std::stringstream ss; + std::string sx, sy; + ss << std::fixed; + if (precision > -1) + ss << std::setprecision(precision); + ss << x; + sx = ss.str(); + ss.str(std::string()); + ss << y; + sy = ss.str(); + return "(" + sx + ", " + sy + ")"; } }; diff --git a/src/engine.cpp b/src/engine.cpp index b596c6e..bf0bca9 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -47,7 +47,7 @@ void Engine::init(void) { // init ui FontSystem::init(game::config::fontFamily); - FontSystem::setFontSize(16); + FontSystem::setFontSize(FontSystem::SizeSmall); FontSystem::setFontColor(1, 1, 1); FontSystem::setFontZ(-6.0f); diff --git a/src/font.cpp b/src/font.cpp index af49d2a..0b425f7 100644 --- a/src/font.cpp +++ b/src/font.cpp @@ -41,9 +41,10 @@ void FontSystem::setFontSize(int size) // convert red-on-black to RGBA auto& g = ftFace->glyph; - std::vector buf (g->bitmap.width * g->bitmap.rows, 0xFFFFFFFF); + std::vector buf (g->bitmap.width * g->bitmap.rows, 0x00FFFFFF); for (auto j = buf.size(); j--;) - buf[j] ^= !g->bitmap.buffer[j] ? buf[j] : 0; + buf[j] |= g->bitmap.buffer[j] << 24; +// buf[j] ^= !g->bitmap.buffer[j] ? buf[j] : 0; d.wh.x = g->bitmap.width; d.wh.y = g->bitmap.rows; diff --git a/src/render.cpp b/src/render.cpp index baa08ee..b9a9770 100644 --- a/src/render.cpp +++ b/src/render.cpp @@ -187,7 +187,7 @@ void render(const int& fps) auto pos = PlayerSystem::getPosition(); UISystem::putText(vec2(offset.x - game::SCREEN_WIDTH / 2, (offset.y + game::SCREEN_HEIGHT / 2) - FontSystem::getSize()), "loc: %s\noffset: %s\nfps: %d\nticks: %d\npcount: %d\nxml: %s\nmem: %llukb (%d)", - pos.toString().c_str(), offset.toString().c_str(), fps, + pos.toString(2).c_str(), offset.toString(2).c_str(), fps, game::time::getTickCount(), ParticleSystem::getCount(), WorldSystem::getXMLFile().c_str(), getUsedMem() / 1024, balance ); diff --git a/src/ui.cpp b/src/ui.cpp index e8fd78a..dea2f8e 100644 --- a/src/ui.cpp +++ b/src/ui.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include @@ -779,34 +780,42 @@ void UISystem::putString(const vec2& p, const std::string& s, float wrap) { vec2 offset = p, add; - for (auto c : s) { - switch (c) { - case '\n': + int sum; + for (auto word : tokens(s, ' ')) { + sum = 0; + for (auto c : word) + sum += FontSystem::getCharWidth(c); + if (wrap > 0 && offset.x + sum > wrap) { offset.y -= FontSystem::getSize() * 1.05f; offset.x = p.x; - break; - case '\b': - offset.x -= add.x; - break; - case '\r': - case '\t': - break; - case ' ': - offset.x += FontSystem::getSize() / 2.0f; - break; - default: - add = FontSystem::putChar(floor(offset.x), floor(offset.y), c); - offset += add; - break; } + + for (auto c : word) { + switch (c) { + case '\n': + //offset.y -= FontSystem::getSize() * 1.05f; + //offset.x = p.x; + break; + case '\b': + //offset.x -= add.x; + break; + case '\r': + case '\t': + break; + default: + add = FontSystem::putChar(floor(offset.x), floor(offset.y), c); + offset.x += add.x; + break; + } - if (wrap != 0.12345f && offset.x >= (wrap - 10)) { - offset.y -= FontSystem::getSize() * 1.05f; - offset.x = p.x; + /*if (wrap != 0.12345f && offset.x >= (wrap - 10)) { + offset.y -= FontSystem::getSize() * 1.05f; + offset.x = p.x; + }*/ } - } - //return offset.x; + offset.x += FontSystem::getSize() / 2.0f; + } } float UISystem::putStringCentered(const vec2& p, const std::string& s, bool print) @@ -972,10 +981,10 @@ void UISystem::render(void) } if (!importantText.empty()) { - FontSystem::setFontSize(24); + FontSystem::setFontSize(FontSystem::SizeLarge); FontSystem::setFontZ(-9.0f); putStringCentered(vec2(offset.x, 400), ui::typeOut(importantText)); FontSystem::setFontZ(-6.0f); - FontSystem::setFontSize(16); + FontSystem::setFontSize(FontSystem::SizeSmall); } } diff --git a/src/ui_menu.cpp b/src/ui_menu.cpp index fd316ce..3afe0dc 100644 --- a/src/ui_menu.cpp +++ b/src/ui_menu.cpp @@ -55,7 +55,7 @@ void Menu::gotoParent(void) { if (parent == nullptr) { game::config::update(); - FontSystem::setFontSize(16); + FontSystem::setFontSize(FontSystem::SizeSmall); } currentMenu = parent; @@ -253,7 +253,7 @@ namespace ui { Render::useShader(&Render::textShader); game::config::update(); - FontSystem::setFontSize(24); + FontSystem::setFontSize(FontSystem::SizeLarge); FontSystem::setFontZ(-9.0); mouse.x = ui::premouse.x+offset.x-(SCREEN_WIDTH/2); @@ -370,7 +370,7 @@ namespace ui { } SDLReceiver::clicked = false; - FontSystem::setFontSize(16); + FontSystem::setFontSize(FontSystem::SizeSmall); FontSystem::setFontZ(-8.0); } diff --git a/ttf/Janyk.ttf b/ttf/Janyk.ttf new file mode 100644 index 0000000000000000000000000000000000000000..c327e163d4248527f9df06d3c761e9d32002324f GIT binary patch literal 14032 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 Y_q^TnN3VSKw=6t&&%~un`8%%v0UhF*%m4rY literal 0 HcmV?d00001 -- 2.39.5