SFML и C++ Уроки \ Разработка игр › Форумы › SFML Graphics › Вывод текста в заданных координатах.
В этой теме 1 ответ, 2 участника, последнее обновление Heisenberg 8 года/лет, 2 мес. назад.
-
АвторСообщения
-
Начало в этой теме https://kychka-pc.ru/Forum/topic/sinsinmin-tema
Задача:Вывести текст в заданных координатах при определённом действии. Получен урон от моба, нанесён урон мобу, получены монетки, получен лвл ап. Текст должен исчезать через определённый промежуток времени. А также двигаться. Текст без движения плохо воспринимается.
Вот код что получился. Он не доделан потому что нет событий…но основы мне пока что достаточно.
Останется просто в определённом событии добавлять в массив
C++1ListTextOut.push_back(new TextOut(x, y, текстВывода, Шрифт, цвет, секунды до исчезания * 1000));C++123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111#include <SFML/Graphics.hpp>#include <iostream>#include <sstream>//сейчас не нужно. раньше выводили текст ( в 13 ом уроке )#include "iostream"#include <vector>#include <list>#include <string>using namespace sf;class TextOut {public:float x, y, timeStart, time;sf::Color color;String TextString;sf::Font font;sf::Text text;TextOut(float X, float Y, String TextStrinG, sf::Font Font, sf::Color Color, float TimeStart){sf::Text Text(TextStrinG, font, 20);x = X, y = Y, TextString = TextStrinG, font = Font, color = Color, timeStart = TimeStart;text = Text;text.setPosition(x, y);text.setColor(color);timeStart = TimeStart;}void update(sf::RenderWindow &window, float time){if (timeStart >= 0){x += 0.04;y -= 0.04;text.setPosition(x, y);window.draw(text);timeStart -= time;std::cout << time << std::endl;}}};int main(){sf::RenderWindow window(sf::VideoMode(800, 600), "Lesson 13. kychka-pc.ru");sf::Font font;font.loadFromFile("CyrilicOld.ttf");sf::Text text("500",font,20);text.setColor(sf::Color::Red);text.setPosition(100, 100);float y = 0;float x = 0;float inc;inc = 0;sf::Clock clock;float textTime = 0;float time = 0;std::list<TextOut*> ListTextOut;std::list<TextOut*>::iterator it;float posXY = 100;ListTextOut.push_back(new TextOut(100, 100, "50", font, sf::Color::Blue, 1 * 1000));ListTextOut.push_back(new TextOut(500, 100, "20", font, sf::Color::Blue, 1 * 1000));ListTextOut.push_back(new TextOut(100, 500, "40", font, sf::Color::Blue, 1 * 1000));while (window.isOpen()){time = clock.getElapsedTime().asMicroseconds();clock.restart();time = time/1000;//time = time/1.2;window.clear();inc += 20*time/800;x = int(inc);y = int(inc);/*text.setString("500");if (x>100) text.setString("");text.setPosition(x, y);*/for (it = ListTextOut.begin(); it != ListTextOut.end();){TextOut *b = *it;if (b->timeStart >= 0){b->update(window, time);it++;}else{it = ListTextOut.erase(it);posXY += 0.1;/*ListTextOut.push_back(new TextOut(100, 500, std::to_string(posXY), font, sf::Color::Blue, 1 * 1000));*/}}//text.setPosition(x+100, y+100);//if (int(x) % 10 == 0)/*window.draw(text);*/window.display();}return 0;};В момент нанесения урона, поднятия монетки, или ещё чего либо запихивай в список текст с нужными параметрами
C++1ListTextOut.push_back(new TextOut(100, 100, "50", font, sf::Color::Blue, 1 * 1000));Тут ты создал сразу 3 текста, которые умрут по истечению TimerStart
C++123ListTextOut.push_back(new TextOut(100, 100, "50", font, sf::Color::Blue, 1 * 1000));ListTextOut.push_back(new TextOut(500, 100, "20", font, sf::Color::Blue, 1 * 1000));ListTextOut.push_back(new TextOut(100, 500, "40", font, sf::Color::Blue, 1 * 1000));Ещё лучше использовать не публичную область видимости полей текста и сделать доступ к полям класса через методы.
Создание текста в момент нанесения урона должен выглядеть примерно так…
C++1234if(hero.Attack()){ListTextOut.push_back(new TextOut(hero.getPositoin().x, hero.getPositoin().y, std::to_string((int)hero.getDamage()), font, sf::Color::Blue, 1 * 1000));} -
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.