DEV Community

Cover image for Onda de Palavras com C++ e SFML
Marcos Oliveira
Marcos Oliveira

Posted on

Onda de Palavras com C++ e SFML

⚡ Youtube Shorts

https://youtu.be/GqU-ILoHLWs


🎼 TikTok

https://www.tiktok.com/@terminalroot/video/7535196304918482181


📷 Reels

https://www.instagram.com/p/DM_I8zWSCpL/


🉐 Código

#include <SFML/Graphics.hpp> #include <cmath> #include <string>  const std::string letters = "É hora de aprender Programação e Desenvolvimento. Um pouco de muito sobre C++, Programação, Desenvolvimento de Games e Web."; struct Letter { sf::Text text; float lifetime; }; struct Position { float x, y; }; float distance(const Position& p1, const Position& p2){ float dx = p2.x - p1.x; float dy = p2.y - p1.y; return std::sqrt(dx * dx + dy * dy); } int main(){ sf::Font font; if(!font.loadFromFile("./arial.ttf")){ return -1; } sf::RenderWindow window(sf::VideoMode(450,800), "SFML Palavras"); window.setFramerateLimit(60); Position position = {400, 300}; std::vector<Letter> lettersOnScreen; bool mouseDown = false; int counter = 0; while( window.isOpen() ){ sf::Event event; while( window.pollEvent(event)){ if( event.type == sf::Event::Closed ){ window.close(); } if(event.type == sf::Event::MouseButtonPressed){ mouseDown = true; } if(event.type == sf::Event::MouseButtonReleased){ mouseDown = false; } } if(mouseDown){ sf::Vector2i mousePos = sf::Mouse::getPosition(window); Position mouse = {static_cast<float>(mousePos.x), static_cast<float>(mousePos.y)}; float d = distance(position, mouse); float fontSize = 5 + d / 2; if(counter >= letters.size()){ counter = 0; } sf::Text text; text.setFont(font); text.setString(letters[counter]); text.setCharacterSize(static_cast<unsigned int>(fontSize)); text.setFillColor(sf::Color::Black); float stepSize = text.getLocalBounds().width; if(d > stepSize){ float angle = std::atan2(mouse.y - position.y, mouse.x - position.x); text.setPosition(position.x, position.y); text.setRotation(angle * 180.f / 3.14f); lettersOnScreen.push_back({text, 255}); position.x += std::cos(angle) * stepSize; position.y += std::sin(angle) * stepSize; ++counter; } } window.clear(sf::Color::White); for(auto it = lettersOnScreen.begin(); it != lettersOnScreen.end();){ it->text.setFillColor(sf::Color(0, 0, 0, static_cast<sf::Uint8>(it->lifetime))); window.draw(it->text); it->lifetime -= 2; if(it->lifetime <= 0){ it = lettersOnScreen.erase(it); }else{ ++it; } } window.display(); } return EXIT_SUCCESS; } // g++ main.cpp -lsfml-graphics -lsfml-window -lsfml-system 
Enter fullscreen mode Exit fullscreen mode

💻 Links Úteis

Top comments (0)