SFML - это кросс платформенная графическая библиотека (включающая в себя дополнительные модули по работе с сетью, потоками, звуком) предназначенная для создания приложений работающих с двухмерной графикой. Благодаря тому что библиотека напрямую работает с OpenGL, достигается высокая производительность внутри приложений. Также стоит отметить поддержку большого количества языков программирования (C++, C, C#, .Net, D, Java, Python, Ruby, OCaml, Go, Pascal и Rust), а также всех современных операционных систем общего назначения, а именно Windows, MacOs и Linux. Поддержки мобильных операционных систем Android и iOs нет, и появится ли в будущем не известно.
SFML выбирают многие разработчики, которым требуется быстро и качественно разработать 2Д приложения. Этот выбор обуславливается, помимо быстрой работы получаемых программ, ещё и простым набором интерфейсов, с помощью которых просходит непосредственная работа с кодом. Далее мы рассмотрим это на примерах из документации и не только.
Прежде чем приступить к разработке, установите набор библиотек необходимых для работы с SFML. Для операционной системы Linux это делается очень просто с помощью команды:
sudo apt-get install libsfml-dev
Первое приложение
Первое приложение которое предлагается написать, в документации к SFML, является простое оконное приложение с выводимой по центру окружности. Код файла main.cpp:
#include <SFML/Graphics.hpp>
int main()
{
sf::RenderWindow window(sf::VideoMode(200, 200), "SFML works!");
sf::CircleShape shape(100.f);
shape.setFillColor(sf::Color::Green);
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
}
window.clear();
window.draw(shape);
window.display();
}
return 0;
}
Для сборки данного приложения будем использовать компиляторы пакета gcc. Выполним команды в терминале, внутри папки с исходным файлом:
g++ -c main.cpp
g++ main.o -o sfml-app -lsfml-graphics -lsfml-window -lsfml-system
В результате, у нас появится исполняемый файл sfml-app. Запустим его помандой ./sfml-app и посмотрим результат:
У нас появится окно с вписанной окружностью, заполненной зелёным цветом. При этом мы можем изменять размер окна, и окружность тоже будет менять свой размер, изменяя свою геометрию.
Теперь давайте поподробнее рассмотрим получившийся код. В первых трёх строчках главной функции, происходит создание окна и определение окружности.
sf::RenderWindow window(sf::VideoMode(200, 200), "SFML works!");
sf::CircleShape shape(100.f);
shape.setFillColor(sf::Color::Green);
Далее, мы видим цикл, внутри которого просходит контроль событий\состояний, возникающих в программе, а именно, открыто ли окно и произошло ли событие закрытия приложения, а также прорисовка фигуры.
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
}
window.clear();
window.draw(shape);
window.display();
}
Если удалить этот цикл, оставив только создание окна, фигуры, а также их прорисовку, то после перезборки и запуска программы, мы ничего не увидим(в лучшем случае вспышку), так как программа будет моментально закрыта, после отработки требуемых действий. То есть цикл, позволяет постоянно отрисовывать текущее состояние и при этом контролировать внешние процессы (как было замечено выше).
Рисование прямоугольников
Рисовать окружность мы с вами научились, теперь давайте рассмотим как рисовать прямоугольники и линии(векторы). Забегая вперёд, линии, это теже самые прямоульники, только малой толщены.
Немного видоизменим первую программу, научив её выводить квадрат. Код файла main.cpp:
#include <SFML/Graphics.hpp>
int main()
{
sf::RenderWindow window(sf::VideoMode(200, 200), "SFML works!");
sf::RectangleShape rectangle(sf::Vector2f(50,50));
rectangle.setPosition(50,25);
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
}
window.clear();
window.draw(rectangle);
window.display();
}
return 0;
}
После сборки и запуска программы мы увидим следующую картинку:
Обратим внимание на две новые строчки:
sf::RectangleShape rectangle(sf::Vector2f(50,50));
rectangle.setPosition(50,25);
Собственно, первая строчка задаёт размер прямоугольника, а вторая, определяет его местоположение на экране.
Чтобы нарисовать линию, как было сказано выше, достаточно просто задать небольшую толщину линии. Пример:
sf::RectangleShape rectangle(sf::Vector2f(50,3));
В результате получим следующее:
Чтобы наше приложение смотрелось интереснее, добавил угол наклона в 45 градусов для нашего вектора с помощью данной команды:
rectangle.setRotation(45);
В результате у нас получится следующая картинка:
Чтобы закрепить новые знания, выведем на экран сразу несколько прямоугольников. Код файла main.cpp:
#include <SFML/Graphics.hpp>
int main()
{
int x = 10;
int count = 5;
sf::RenderWindow window(sf::VideoMode(200, 200), "SFML works!");
sf::RectangleShape rectangle(sf::Vector2f(30,30));
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
}
window.clear();
x = -35;
for(int i = 0 ; i < count ; i++){
x = x + 40;
rectangle.setPosition(x,10);
window.draw(rectangle);
}
window.display();
}
return 0;
}
Результат работы:
#cpp #SFML #вводник