SFML и C++ Уроки \ Разработка игр › Форумы › SFML Graphics › Класс многострочного текста › Ответ в теме: Класс многострочного текста
В принципе я уже всё сделал, но как обычно, сорян за говнокод
C++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
struct textMultiLine { sf::Text text; // - Нужен для расчёта длинны строки sf::Font* font; sf::String str1; // Входящая строка sf::String str2; // Строка которую нужно отображать std::vector<sf::String> vecWords; std::vector<sf::String> vecString; int width; int height; // width - Ширина отображаемого текста textMultiLine(sf::String str, int width_) { width = width_; // ширина задана height = 0; // высота = 0 str1 = str; // записываем строку scanWords(); // забираем из неё слова } // обновление 9а вдруг какие-то параметры поменялись void update() { vecString.clear(); str2.clear(); scanString(); unionStrings(); height = text.getLocalBounds().height +1; } void setFont(sf::Font* font_) { font = font_; text.setFont(*font); text.setCharacterSize(16); text.setColor(sf::Color::Black); } // Заполняет вектор слов void scanWords() { sf::String buff; for(int i=0; i<str1.getSize(); i++) { if(str1[i] != ' ') { buff += str1[i]; } else { if(buff != "") { addWord(buff); buff = ""; } } } addWord(buff); } bool addWord(sf::String str_) { if(str_ != "" && str_ != " ") { vecWords.push_back(str_); return true; } return false; } // Заполняет вектор строк void scanString() { sf::String buff; sf::String buff2; for(int i=0; i<vecWords.size(); i++) { buff = buff2; if(buff2 == "") buff2 += vecWords[i]; else buff2 += "_" + vecWords[i]; text.setString(buff2); // делаем строку чтобы измерить ширину строки int w = text.getLocalBounds().width; // ширина строки if(w > width) {// Если при добавлении слова ширина стала больше нужной vecString.push_back(buff+'\n'); // добавляем в вектор строк буфер1 (не содержит последнего слова) buff = ""; // чистим буфер1 buff2 = vecWords[i]; // в буфер2 засовываем последнее слово } } vecString.push_back(buff2); } void unionStrings() { for(int i=0; i<vecString.size(); i++) str2 += vecString[i]; text.setString(str2); } }; |
а в main как-то так
C++
1 2 3 4 5 6 7 |
textMultiLine* txt = new textMultiLine("Моментально восстанавливает 50 маны тратя при этом 10 здоровья.", 250); sf::Font font; font.loadFromFile("fonts/AnimeAceV02.ttf"); txt->setFont(&font); txt->update(); |
Так-же при изменении параметра width и юзе update() можно обновить текст до другой ширины.