Все статьи Знакомство с SFML. Компьютерная графика.
SFML (Simple Fast Multimedia Library) — это C++ библиотека для мультимедиа. В статье мы воспользуемся SFML для рисования фигур в окне.
Создайте каталог с названием sfml.1. Откройте каталог в Visual Studio Code. Откройте терминал и убедитесь, что вы находитесь в этом каталоге:

Все упражнения и задания вы будете выполнять в подкаталогах каталога sfml.1: sfml.1\00, sfml.1\01 и так далее.
Следуйте инструкциям. Также выполните задания, указанные в тексте. Если при компиляции у вас возникнут ошибки, внимательно читайте текст ошибок в терминале.
Простая программа со сборкой через CMake
CMake — это система сборки. Нам она позволит не печатать каждый раз команды компиляции с нуля, тем более что команды будут становиться всё сложнее и сложнее.
- Создайте в каталоге sfml.1файл с именемCMakeLists.txt
- Скопируйте следующий текст в файл и сохраните в этом файле:
# Минимальная версия CMake: 3.8
cmake_minimum_required(VERSION 3.8 FATAL_ERROR)
# Имя проекта: sfml-lab-1
project(sfml-lab-1)
# Подкаталог 00 содержит ещё один CMakeLists.txt
add_subdirectory(00)
Теперь создайте в каталоге sfml.1 подкаталог 00, в каталоге 00 создайте ещё один файл с именем CMakeLists.txt. Сохраните в нём другой текст:
# Добавляем исполняемый файл 00
# Он собирается из 1 файла исходного кода: main.cpp
add_executable(00 main.cpp)
Затем создайте файл main.cpp в каталоге 00 и напишите в нём любую простую программу, например:
#include <iostream>
int main()
{
	int a = 0;
	int b = 0;
	std::cout << "enter two numbers:" << std::endl;
	std::cin >> a >> b;
	std::cout << "sum: " << (a + b) << std::endl;
}
Сейчас каталог должен выглядеть так:

Далее следуйте шагам:
- Откройте терминал и введите команду g++ 00/main.cpp -o 00.exe. Убедитесь, что компиляция прошла успешно, затем выполните команду00.exe.
- Удалите программу командой del 00.exe
- Затем соберите программу с помощью CMake. Эта операция выполняется в два шага: конфигурирование + сборка.
Внимание: в обеих командах ниже есть точка “.”, она означает “использовать текущий каталог”
cmake -G "MinGW Makefiles" .
cmake --build .
Вывод первой команды будет примерно таким:
D:\Projects\CppDistro\workspace>cmake -G "MinGW Makefiles" .
-- The C compiler identification is GNU 7.2.0
-- The CXX compiler identification is GNU 7.2.0
...
-- Configuring done
-- Generating done
-- Build files have been written to: D:/Projects/CppDistro/workspace
Вывод второй команды будет выглядеть так:
D:\Projects\CppDistro\workspace>cmake --build .
Scanning dependencies of target 00
[ 50%] Building CXX object 00/CMakeFiles/00.dir/main.cpp.obj
[100%] Linking CXX executable 00.exe
[100%] Built target 00
Если сборка была успешной, запустите 00\00.exe, чтобы проверить, что программа доступна и работоспособна.
Поздравляем, теперь вы умеете собирать проекты с помощью CMake!
Закрепим результат с помощью git
Чтобы ваши достижения не потерялись, вам надо использовать систему контроля версий Git. В консоли введите следующие команды
git init
git add CMakeLists.txt
git add 00/CMakeLists.txt
git add 00/main.cpp
Ни одна из команд
git addне должна выводить сообщений. Если где-то было сообщение, значит, у вас возникла ошибка. В этом случае проверьте команду и введите её снова.
Теперь введите команду git status и посмотрите на её вывод. Зелёным цветом помечены файлы, добавленные под контроль версий, красным помечены остальные файлы. Если вывод команды у вас совпадает со скриншотом, можно продолжить.

Пришло время зафиксировать свою первую версию! Введите команду git commit -m "Added A+B program". Git зафиксирует версию и выведет краткий отчёт:
D:\Projects\CppDistro\workspace>git commit -m "Added A+B program"
[master (root-commit) 340778e] Added A+B program
 3 files changed, 16 insertions(+)
 create mode 100644 00/CMakeLists.txt
 create mode 100644 00/main.cpp
 create mode 100644 CMakeLists.txt
Возможно, git откажется выполнять фиксацию и предложит ввести свой email и имя. Ему нужны эти данные, чтобы у каждой версии был указан автор изменений. Вы можете ввести данные двумя командами, заменив "ваш.email" и "ваше.имя" на ваши email и имя, например "admin@localhost.ru" и "Lavrentiy Pavlovich"
git config --global user.email "ваш.email"
git config --global user.name "ваше.имя"
Теперь введите команду git clean -fd. О чудо! Все посторонние файлы, кроме исходного кода, теперь исчезли. Команда убрала всё, что не занесено под контроль версий.
Простая программа с библиотекой SFML
Создать графическую программу немногим сложнее, чем консольную, благодаря SFML. SFML состоит из множества модулей, и нам нужны три модуля:
- SFML system, потому что его используют остальные два модуля
- SFML window, чтобы создать окно программы
- SFML graphics, чтобы нарисовать хотя бы что-то в этом окне
Для начала создайте каталог 01, и в нём создайте файл CMakeLists.txt, сохраните в нём текст:
add_executable(01 main.cpp)
set(SFML_STATIC_LIBRARIES TRUE)
find_package(Freetype)
find_package(JPEG)
find_package(SFML 2 COMPONENTS window graphics system)
target_compile_features(01 PUBLIC cxx_std_17)
target_compile_definitions(01 PRIVATE SFML_STATIC)
target_link_libraries(01 ${SFML_LIBRARIES} ${SFML_DEPENDENCIES})
Этот текст — скрипт сборки на языке CMake. В этом скрипте мы подключаем три модуля SFML (window, graphics, system), устанавливаем версию языка (C++2017), настраиваем зависимости SFML (библиотеки libjpeg и freetype). Если бы мы напрямую вызывали g++, нам бы пришлось писать очень длинные команды — скрипт позволяет такого избежать.
Теперь создайте в каталоге 01 файл main.cpp, и аккуратно перепишите в него код:

Теперь вернитесь к основному файлу CMakeLists.txt и добавьте строку add_subdirectory(01), чтобы он выглядел так:
cmake_minimum_required(VERSION 3.8 FATAL_ERROR)
project(cpp-samples)
add_subdirectory(00)
add_subdirectory(01)
После этого снова запустите CMake:
cmake -G "MinGW Makefiles"
cmake --build .
Если сборка была успешной, запустите программу 01\01.exe. На 5 секунд появится окно, а затем оно исчезнет.

Окно показывается, пока выполняется инструкция
sf::sleep(sf::seconds(5));, а затем программа заканчивается и окно скрывается. В будущем мы научимся показывать окно столько, сколько захотим, и закрывать по нажатию на кнопку в верхнем правом углу окна.
Давайте разберём, что выполняет код:
- Инструкция sf::RenderWindow window(sf::VideoMode({800, 600}), "title")объявляет переменную window, которая имеет тип “графическое окно”, размеры 800x600 px и незамысловатый заголовок “title”.
- Вызов метода window.clear()очищает окно, а вызовwindow.display()выводит на экран то, что было нарисовано после очистки.- подробнее о методах sf::RenderWindowвы узнаете в документации SFML (sfml-dev.org).
 
- подробнее о методах 
- Инструкция sf::CircleShape shape1(40)объявляет переменную shape1 — круг размером 40px.
- Вызовы shape1.setPositionиshape1.setFillColorзадают позицию круга в пикселях и цвет в виде RGB-компонентов (Red, Green, Blue).- подробнее о методах CircleShapeвы узнаете на странице документации (sfml-dev.org)
 
- подробнее о методах 
Теперь добавьте больше фигур:

Запустите CMake, а затем программу:
cmake --build .
01\01.exe
У вас должно получиться что-то такое:

Освоим прямоугольники (rectangles) и повороты (rotation)
SFML позволяет рисовать разные типы фигур, в том числе прямоугольники. Прямоугольным фигурам соответствует класс sf::RectangleShape.
Создайте каталог 02, и в нём создайте файл CMakeLists.txt и сохраните текст:
add_executable(02 main.cpp)
set(SFML_STATIC_LIBRARIES TRUE)
find_package(Freetype)
find_package(JPEG)
find_package(SFML 2 COMPONENTS window graphics system)
target_compile_features(02 PUBLIC cxx_std_17)
target_compile_definitions(02 PRIVATE SFML_STATIC)
target_link_libraries(02 ${SFML_LIBRARIES} ${SFML_DEPENDENCIES})
Теперь создайте в каталоге 02 файл main.cpp, и аккуратно перепишите в него код. Посмотрите на код: определите, где создаются два прямоугольника (rectangle) и где устанавливается поворот в градусах (rotation).

По умолчанию фигуры поворачиваются относительно своего центра, но вы можете изменить это поведение с помощью метода
setOrigin, доступного для любой фигуры. Подробнее об этом методе вы узнаете из документации SFML.
Теперь вернитесь к основному файлу CMakeLists.txt и добавьте строку add_subdirectory(02), чтобы он выглядел так:
cmake_minimum_required(VERSION 3.8 FATAL_ERROR)
project(cpp-samples)
add_subdirectory(00)
add_subdirectory(01)
add_subdirectory(02)
Соберите через CMake и запустите 02\02.exe. Результат будет таким:

Теперь вам надо зафиксировать успех! В терминале выполните команды:
git init
git add CMakeLists.txt
git add 01/CMakeLists.txt
git add 01/main.cpp
git add 02/CMakeLists.txt
git add 02/main.cpp
git status
git commit -m "Added rectangles example"
Введите команду git log. Она покажет вам журнал изменений; этот журнал показывает все ранее зафиксированные версии. Выйти из просмотра лога можно с помощью горячей клавиши Q.
Задание sfml1.1
Нарисуйте с помощью кругов и прямоугольников светофор такого вида:

- Перед тем, как написать код, нарисуйте светофор на клетчатой бумаге — так вы сможете измерить координаты, на которых должны располагаться фигуры.
- Светофор должен быть нарисован ровно, без явных искажений.
- Размер окна должен быть немного больше размера светофора (отступ 10-20px)
- Когда вы сделаете задание, зафиксируйте его с помощью git.
Задание sfml1.2
Нарисуйте фигурами свои инициалы в английской транскрипции.
- Например, если вас зовут “Fadeev Victor Andreevich”, напишите фигурами три буквы: FVA.
- Перед тем, как написать код, нарисуйте эти буквы на клетчатой бумаге — так вы сможете измерить координаты, на которых должны располагаться буквы, и примерно оценить углы поворота.
- Нарисованные инициалы должны быть читаемые и аккуратные.
- Когда вы сделаете задание, зафиксируйте его с помощью git.
Освоим выпуклые многоугольники (convex shapes)
SFML позволяет рисовать выпуклые многоугольники — то есть трапеции, треугольники, некоторые пятиугольники и так далее. Таким фигурам соответствует класс sf::ConvexShape.
Создайте каталог 03, и в нём создайте файл CMakeLists.txt, сохраните текст:
add_executable(03 main.cpp)
set(SFML_STATIC_LIBRARIES TRUE)
find_package(Freetype)
find_package(JPEG)
find_package(SFML 2 COMPONENTS window graphics system)
target_compile_features(03 PUBLIC cxx_std_17)
target_compile_definitions(03 PRIVATE SFML_STATIC)
target_link_libraries(03 ${SFML_LIBRARIES} ${SFML_DEPENDENCIES})
Теперь создайте в каталоге 03 файл main.cpp, и аккуратно перепишите в него код. Посмотрите на код: определите, где создаются два прямоугольника (rectangle) и где устанавливается поворот в градусах (rotation):

Теперь вернитесь к основному файлу CMakeLists.txt и добавьте строку add_subdirectory(03), чтобы он выглядел так:
cmake_minimum_required(VERSION 3.8 FATAL_ERROR)
project(cpp-samples)
add_subdirectory(00)
add_subdirectory(01)
add_subdirectory(02)
add_subdirectory(03)
Соберите через CMake и запустите 03\03.exe. Результат будет таким:

Если всё в порядке, зафиксируйте код с помощью Git (добавьте файлы и сделайте commit).
Введите команду git log, проверьте, что commit сделан. Выйти из просмотра лога можно с помощью горячей клавиши Q.
Задание sfml1.3
Нарисуйте с помощью ConvexShape, RectangleShape и CircleShape домик такого вида:

- Перед тем, как написать код, нарисуйте домик на клетчатой бумаге — так вы сможете измерить координаты, на которых должны располагаться фигуры, и определить координаты точек для выпуклых многоугольников.
- Домик должен быть нарисован ровно, без явных искажений.
- Когда вы сделаете задание, зафиксируйте его с помощью git.