@terminalroot Onda de Palavras com C++ e SFML #coding #cpp #cplusplus #sfml #programacao #desenvolvimento ♬ som original - terminalroot
#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