Созданные ответы форума
-
АвторСообщения
-
2 версия многострочного текста. Теперь он цветной!
https://kychka-pc.ru/wiki/svobodnaya-baza-znanij-sfml/uroki-sfml/razrabotka-2d-igr/uroki-ot-legozaur/sfsound-sfmusicВ принципе я уже всё сделал, но как обычно, сорян за говнокод
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() можно обновить текст до другой ширины.
Вставка ‘\n’ в строку решила часть проблемы
пример:C++1text.setString("1234567890\n1234567890");допустим у меня есть рабочая область в 200 px, и мне в неё нужно поместить целые слова, а остальные перекинуть на следующую строку и т.д.
А что насчёт того, что если спрайт прозрачный, то прозрачность спрайтов складывается, и получается не очень красиво.
Или это уже другая темат.е. повернуть отрисовать, повернуть отрисовать, и т.д.?
Ну я всё ещё раз обдумал, и всё-же, лучше через классы, однозначно, т.к. мне нужны будут координаты орудий, чтобы из них вылетали “патроны”.
ошибка скорее всего в том, что вы не правильно используете передачу окна в функцию и/или не правильно его используете в самой функции.
Когда я делал свою игру, то вот так сделал:
в main.cpp
game->draw(&window);
// передаю ссылку на окно
в Game.cpp
void Game::draw(sf::RenderWindow *window)
{ // отрисовка игры
if( numSpaceShip != 0 )
for(std::vector<SpaceShip*>::iterator it = vecSpaceShip.begin(); it != vecSpaceShip.end(); ++it)
if( (*it)->getIsActivity() == true )
(*it)->draw(window);
}// передаю эту же ссылку в экземпляр класса КосмическийКорабль
SpaceShip.cpp
void SpaceShip::draw(sf::RenderWindow *window)
{
(*window).draw(sprite);// а тут получаю окно, и использую метод draw()
}о векторе можете почитать тут http://cppstudio.com/post/8453/
Всё нормально работает, но такие “лёгкие” игры не должны жрать 20% ЦП на современных компах
мы тут посоветовались с программистами, и пришли к выводу что это while (window.isOpen()) виноват, т.к. он доимного раз выполняется, что нагружает процессор.
Мб есть какой вариант типа speep(50) ?
#include <SFML/Graphics.hpp>
int main()
{
sf::RenderWindow window(sf::VideoMode(200, 200), “Lesson 1. kychka-pc.ru”);
sf::CircleShape shape(100.f);
shape.setFillColor(sf::Color::Green);while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
}window.clear();
window.draw(shape);
window.display();
}return 0;
} -
АвторСообщения