Найти тему
Мои заметки

SFML - как основа 2Д графических программ\игр (дополняется)

Оглавление

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 и посмотрим результат:

-2

У нас появится окно с вписанной окружностью, заполненной зелёным цветом. При этом мы можем изменять размер окна, и окружность тоже будет менять свой размер, изменяя свою геометрию.

Теперь давайте поподробнее рассмотрим получившийся код. В первых трёх строчках главной функции, происходит создание окна и определение окружности.

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;
}

После сборки и запуска программы мы увидим следующую картинку:

-3

Обратим внимание на две новые строчки:

sf::RectangleShape rectangle(sf::Vector2f(50,50));
rectangle.setPosition(50,25);

Собственно, первая строчка задаёт размер прямоугольника, а вторая, определяет его местоположение на экране.

Чтобы нарисовать линию, как было сказано выше, достаточно просто задать небольшую толщину линии. Пример:

sf::RectangleShape rectangle(sf::Vector2f(50,3));

В результате получим следующее:

-4

Чтобы наше приложение смотрелось интереснее, добавил угол наклона в 45 градусов для нашего вектора с помощью данной команды:

rectangle.setRotation(45);

В результате у нас получится следующая картинка:

-5

Чтобы закрепить новые знания, выведем на экран сразу несколько прямоугольников. Код файла 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;
}

Результат работы:

-6

#cpp #SFML #вводник