Onda de Palavras com C++ e SFML

〰️ Um vídeo curto mostrando do zero como criar um efeito estilo ondas com fade de palavras. Código incluso.


Onda de Palavras com C++ e SFML


⚡ Youtube Shorts


🎼 TikTok

@terminalroot Onda de Palavras com C++ e SFML #coding #cpp #cplusplus #sfml #programacao #desenvolvimento ♬ som original - terminalroot

📷 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


shorts youtube tiktok reels cpp sfml gamedev


Compartilhe


Nosso canal no Youtube

Inscreva-se


Marcos Oliveira

Marcos Oliveira

Desenvolvedor de software
https://github.com/terroo


Crie Aplicativos Gráficos para Linux e Windows com C++

Aprenda C++ Moderno e crie Games, Programas CLI, GUI e TUI de forma fácil.

Saiba Mais

Receba as novidades no seu e-mail!

Após cadastro e confirmação do e-mail, enviaremos semanalmente resumos e também sempre que houver novidades por aqui para que você mantenha-se atualizado!