SFML и C++ Уроки \ Разработка игр › Форумы › SFML Graphics › Класс многострочного текста
В этой теме 3 ответа, 1 участник, последнее обновление legozaur 7 года/лет, 3 мес. назад.
-
АвторСообщения
-
Что посоветуете?
Класс содержащий std::vector<sf::String> vecStrings или std::vector<sf::String> vecWords не хотелось бы создавать, или придётся?
Файл с конкретной ситуацией приложен.
Вложения:
You must be logged in to view attached files.Вставка ‘\n’ в строку решила часть проблемы
пример:C++1text.setString("1234567890\n1234567890");допустим у меня есть рабочая область в 200 px, и мне в неё нужно поместить целые слова, а остальные перекинуть на следующую строку и т.д.
В принципе я уже всё сделал, но как обычно, сорян за говнокод
C++123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101struct 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; // высота = 0str1 = 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];elsebuff2 += "_" + vecWords[i];text.setString(buff2); // делаем строку чтобы измерить ширину строкиint w = text.getLocalBounds().width; // ширина строкиif(w > width){// Если при добавлении слова ширина стала больше нужнойvecString.push_back(buff+'\n'); // добавляем в вектор строк буфер1 (не содержит последнего слова)buff = ""; // чистим буфер1buff2 = 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++1234567textMultiLine* txt = new textMultiLine("Моментально восстанавливает 50 маны тратя при этом 10 здоровья.", 250);sf::Font font;font.loadFromFile("fonts/AnimeAceV02.ttf");txt->setFont(&font);txt->update();Так-же при изменении параметра width и юзе update() можно обновить текст до другой ширины.
2 версия многострочного текста. Теперь он цветной!
https://kychka-pc.ru/wiki/svobodnaya-baza-znanij-sfml/uroki-sfml/razrabotka-2d-igr/uroki-ot-legozaur/sfsound-sfmusic -
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.