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)