Руководство по sfml

Время на прочтение
6 мин

Количество просмотров 88K

От переводчика: данная статья является первой в цикле переводов официального руководства по библиотеке SFML. Данный цикл статей ставит своей целью предоставить людям, не знающим язык оригинала, возможность ознакомится с этой библиотекой. SFML — это простая и кроссплатформенная мультимедиа библиотека. SFML обеспечивает простой интерфейс для разработки игр и прочих мультимедийных приложений. Оригинальную статью можно найти тут. Начнем.

Библиотека SFML предоставляет простой интерфейс для различных компонентов вашего компьютера, чтобы облегчить разработку игр и мультимедийных приложений. Она состоит из пяти модулей: system, window, graphics, audio и network.

Используя SFML, ваше приложение может быть скомпилировано и запущено на наиболее распространенных платформах: Windows, Linux, Mac OS X(планируется поддержка Android и IOS).

Предварительно скомпилированные SDK для вашей ОС доступны на странице загрузки.

SFML официально поддерживает C и .NET. Также, благодаря своему активному сообществу, она доступна на многих других языках, таких как Java, Ruby, Python, Go и др.

Вступление

Эта статья — первая, которую вам следует прочитать, если вы используете среду разработки Visual Studio (Visual C++ compiler). В ней будет рассказано, как настроить ваш проект.

Установка SFML

Для начала вам необходимо скачать SFML SDK со страницы загрузки.

Скаченный вами пакет должен соответствовать вашей версии Visual C++. Например, библиотека, скомпилированная с помощью VC++ 10 (Visual Studio 2010) не будет совместима с VC++ 12 (Visual Studio 2013). Если вы не найдете на странице загрузки пакет SFML, скомпилированный для вашей версии Visual C++, вам придется собрать SFML самостоятельно.

Далее вы должны распаковать архив с SFML в любую удобную для вас директорию. Копировать заголовочные файлы и библиотеки в вашу установку Visual Studio не рекомендуется. Лучше держать библиотеки в отдельном месте, особенно если вы намереваетесь использовать несколько версий одной библиотеки или несколько компиляторов.

Создание и конфигурирование проекта SFML

Первое, что вам необходимо сделать — это выбрать тип создаваемого проекта: вы должны выбрать «Win32 application». Мастер предложит вам несколько опций для настройки проекта: выберите «Console application» в том случае, если вам нужна консоль, либо «Windows application» в обратном случае. Выберите «Empty project», если вам не нужен автоматически сгенерированный код.

Создайте файл main.cpp и добавьте его в проект. Этим вы примените настройки C++ (в противном случае Visual Studio не будет знать, какой язык мы будем использовать для данного проекта). Содержимое файла main.cpp будет приведено ниже.

Теперь вам необходимо указать компилятору, где искать заголовочные файлы (файлы с расширением .hpp) и компоновщику, где искать библиотеки SFML (файлы с расширением .lib).

Добавьте в свойства проекта следующее:

  • Путь до заголовочных файлов SFML (<путь-к-установке-SFML>/include) в C/C++ » General » Additional Include Directories
  • Путь до библиотек SFML (<путь-к-установке-SFML>/lib) в Linker » General » Additional Library Directories

Эти пути совпадают для конфигураций Debug и Release, так что вы можете установить их глобально для вашего проекта («All configurations»).

Следующий шаг — компоновка вашего приложения с библиотеками SFML (файлы с расширением .lib). SFML состоит из пяти модулей (system, window, graphics, network и audio) и библиотек для каждого из них. Библиотеки должны быть добавлены в свойства проекта в Linker » Input » Additional Dependencies. Добавьте те библиотеки SFML, в которых вы нуждаетесь, например «sfml-graphics.lib», «sfml-window.lib» и «sfml-system.lib».

Важно указать библиотеки, соответствующие конфигурации: «sfml-xxx-d.lib» для Debug и «sfml-xxx.lib» для Release, иначе могут возникнуть ошибки.

Настройки, приведенные выше, позволят вам скомпоновать ваш проект с динамической версией SFML, для которой требуются DLL файлы. Если вы хотите напрямую интегрировать SFML в ваш исполняемый файл, а не использовать компоновку с динамической библиотекой, вы должны скомпоновать статическую версию библиотеки. Статические библиотеки SFML имеют суффикс «-s»: «sfml-xxx-s-d.lib» для конфигурации Debug и «sfml-xxx-s.lib» для Release.

Также вам необходимо определить макрос SFML_STATIC в опциях препроцессора вашего проекта.

Начиная с SFML 2.2 при статической компоновке вам также необходимо скомпоновать все зависимости SFML. Это означает, что если, к примеру, вы скомпонуете sfml-window-s.lib или sfml-window-s-d.lib, вам также придется скомпоновать opengl32.lib, winmm.lib и gdi32.lib. Некоторые из этих библиотек, возможно, уже перечислены в разделе «Inherited values», но добавление их не должно вызвать каких либо проблем.

В таблице ниже представлены зависимости для каждого модуля, добавьте -d если вы хотите скомпоновать Debug библиотеки SFML:

Модуль Зависимости
sfml-graphics-s.lib
  • sfml-window-s.lib
  • sfml-system-s.lib
  • opengl32.lib
  • freetype.lib
  • jpeg.lib
sfml-window-s.lib
  • sfml-system-s.lib
  • opengl32.lib
  • winmm.lib
  • gdi32.lib
sfml-audio-s.lib
  • sfml-system-s.lib
  • openal32.lib
  • flac.lib
  • vorbisenc.lib
  • vorbisfile.lib
  • vorbis.lib
  • ogg.lib
sfml-network-s.lib
  • sfml-system-s.lib
  • ws2_32.lib
sfml-system-s.lib
  • winmm.lib

Из таблицы вы могли заметить, что одни модули SFML могут зависить от других, например, sfml-graphics-s.lib зависит от sfml-window-s.lib и sfml-system-s.lib. Если вы производите статическую компоновку библиотеки SFML, будьте уверены, что все зависимости из цепочки зависимостей были удовлетворены. Если одна из зависимостей отсутствует, вы получите ошибку компоновщика.

Если вы немного запутались, не волнуйтесь, для начинающего совершенно нормально быть перегруженным всей этой информацией о статическом связывании.Если у вас что-то не получится с первого раза, вы можете попробовать еще раз имея в виду все сказанное выше. Если у вас все же возникнут трудности со статическим связыванием, вы можете попробовать поискать решение в разделе FAQ или на форуме.

Если вы не знаете чем отличаются динамические (также называемые общими) и статические библиотеки и какой тип библиотек использовать, вы можете найти больше информации в интернете. На данную тему есть множество хороших статей/блогов/постов.

Ваш проект готов, давайте напишем немного кода, что бы проверить, что все работает правильно. Поместите следующий код в файл 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;
}

Если при создании проекта вы выбрали опцию «Windows application», то точкой входа в вашу программу должна быть функция «WinMain» вместо «main». Так как это специфика Windows, ваш код не будет компилироваться на Linux или Mac OS X. SFML предоставляет способ сохранить стандартной точкой входа «main» в том случае, если вы скомпонуете свой проект с модулем sfml-main («sfml-main-d.lib» для Debug, «sfml-main.lib» для Release) таким же способом, которым вы скомпоновали sfml-graphics, sfml-window и sfml-system.

Теперь скомпилируйте проект, и, если вы скомпоновали вашу программу с динамической версией SFML, не забудьте скопировать файлы с расширением .DLL (они расположены в <путь-к-установке-SFML>/bin) в директорию, в которой расположен исполняемый файл вашей программы. Запустите программу, и, если все было сделано правильно, вы должны увидеть это:

Если вы используете модуль sfml-audio (независимо от того, статическую или динамическую его версию), вы также должны скопировать внешнюю dll библиотеку OpenAL32.dll. Этот файл также может быть найден в директории <путь-к-установке-SFML>/bin.

Следующая статья: SFML и Code::Blocks (MinGW).

Фигуры

12.07.2014

Введение

SFML предоставляет набор классов для отображения простых фигур. Каждый из типов фигур — это отдельный класс, но все они происходят из одного базового класса и потому имеют набор одинаковых методов. Каждый класс добавляет специфичные для него свойства: радиус для круга, размеры для прямоугольника, вершины многоугольника и т.д.

Общие свойства фигур

Трансформация (позиция, поворот, масштаб)

Это свойство является общим для всех графических классов SFML, поэтому они описаны в отдельном руководстве: (пока тут ссылка на не переведённый оригинал).

Цвет

Одно из главнейших свойств фигур — это их цвет, который можно менять с помощью метода setFillColor().

sf::CircleShape shape(50);

// задаём фигуре зелёный цвет
shape.setFillColor(sf::Color(100, 250, 50));

graphics-shape-color

(далее…)

Текст и шрифты

samuel_unknown
07.05.2014

Загрузка шрифта

Перед рисованием текста, вам нужно загрузить шрифт. Для работы со шрифтами используется специальный класс sf::Font. Он поддерживает три главных операции: загрузка шрифта, получение из него глифов (визуальных символов) и чтение его атрибутов.

Начнём с загрузки. Самый простой способ загрузить шрифт, это загрузить его из файла на диске, сделать это можно при помощи функции loadFromFile().

sf::Font font;
if (!font.loadFromFile("arial.ttf"))
{
 // ошибка...
}

(далее…)

Спрайты и текстуры

samuel_unknown
25.04.2014

Термины

Вероятно вы уже знакомы с этими терминами, но всё же давайте кратко их определим.

Текстура — это изображение. Мы же называем изображение «текстурой» из-за его специфической роли: их наносят на 2D объекты.

Спрайт — это текстурированный прямоугольник.

graphics-sprites-definition

Загрузка текстуры

(далее…)

Рисование 2D объектов

samuel_unknown
21.04.2014

Окно для рисования

Для рисования объектов с помощью графического модуля, вам необходимо использовать специальный класс окна: sf::RenderWindow. Этот класс является наследником класса sf::Window и обладает всем методами класса родителя. Всё что вы изучили о sf::Window (создание, обработка событий, настройка частоты кадров, смешанное использование с OpenGL и т.д.), применимо и к sf::RenderWindow.

Помимо этого, sf::RenderWindow имеет методы облегчающие задачу рисования объектов. В этом уроке мы сосредоточимся на двух таких методах: clear() и draw(). Они просты как и их названия: clear() очищает окно выбранным цветом, а draw() рисует любой переданный ему объект.

Так выглядит типичный главный цикл с окном визуализации (render window):

(далее…)

Клавиатура, мышь и джойстик

samuel_unknown
18.04.2014

Введение

Этот урок объясняет как получить доступ к глобальным ресурсам (global inputs): клавиатуре, мыши и джойстику. Не следует путать их с событиями: ресурсы в режиме реального времени позволяют запросить глобальные состояния клавиатуры, мыши и джойстика в любое время («Эта кнопка нажата в данный момент?», «Где мышь?»). В то время как события уведомляют вас когда что-то происходит («Эта кнопка была нажата», «Мышь переместилась»).

Клавиатура

Класс, предоставляющий доступ к состоянию клавиатуры, — sf::Keyboard. Он содержит только один метод isKeyPressed(), который проверяет текущее состояние клавиши (нажата или отпущена). Это статический метод, и поэтому вам не нужно создавать экземпляр класса sf::Keyboard что бы воспользоваться им.

Эта функция напрямую считывает состояние клавиатуры игнорируя факт, что ваше окно активно или неактивно.

if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
{
 // нажата клавиша влево: сдвинем нашего героя
 character.move(1, 0);
}

Коды клавиш определены в перечислении sf::Keyboard::Key.

Коды некоторых клавиш могут отсутствовать или быть неправильно интерпретированы в зависимости от ОС и раскладки клавиатуры. Это будет улучшено в следующих версиях
SFML.

(далее…)

События

samuel_unknown
17.04.2014

Введение

Этот урок представляет подробный перечень событий окна. Он описывает их и показывает как можно и нельзя использовать события.

Тип sf::Event

Прежде чем перейти к событиям, важно понять что из себя представляет тип sf::Event и как правильно им пользоваться. sf::Event — это объединение, а значит, что только один из членов этого объединения допустим (т.е. существует) в данный момент времени (все элементы объединения хранятся в одной области памяти; за подробностями — в любой учебник по с++). Допустимым членом является тот, который соответствует типу события, например event.key для события KeyPressed. Попытка считывания другого члена приведёт к неопределённому поведению (скорее всего вы получите недопустимые или случайные значения). Поэтому никогда не пытайтесь использовать член события, который не соответствуют типу этого события.

Экземпляры sf::Event в качестве аргументов принимаются методом pollEvent() (или waitEvent()) класса sf::Window. Только две эти функции могут предоставить допустимые события, любая попытка использовать sf::Event без предварительного успешного вызова pollEvent() (или waitEvent()) приведёт к такому же неопределённому поведению, о котором говорилось выше.

Для большей ясности, вот так выглядит типичный цикл с использованием событий:

sf::Event event;

// пока имеются события в очереди...
while (window.pollEvent(event))
{
    // проверка типа события...
    switch (event.type)
    {
        // закрытие окна
        case sf::Event::Closed:
            window.close();
            break;

        // нажатие клавиш
        case sf::Event::KeyPressed:
            ...
            break;

        // мы не обрабатываем другие типы событий
        default:
            break;
    }
}

(далее…)

Открытие и управление окном SFML

samuel_unknown
17.04.2014

Введение

Этот урок рассказывает только о том, как открывать окно и как управлять им. Рисование объектов находится вне сферы действия модуля sfml-window: оно обрабатывается модулем sfml-graphics. Однако, управление окном остаётся точно таким же, поэтому прочитать этот урок в любом случае нужно.

Открытие окна

Окна в SFML определяются с помощью класса sf::Window. Окно может быть создано и открыто непосредственно в конструкторе:

#include <SFML/Window.hpp>

int main()
{
    sf::Window window(sf::VideoMode(800, 600), "My window");

    ...

    return 0;
}

Первый аргумент — видео режим (video mode), определяет размер окна (внутренний размер, без заголовка и границ). Здесь мы создаём окно 800 x 600 пикселей.
Класс sf::VideoMode имеет несколько интересных статических функций для получения разрешения рабочего стола или списка допустимых видео режимов для полноэкранного режима. Если интересно, то загляните в документацию.

Второй аргумент это просто заголовок окна. (далее…)

Пользовательские потоки данных

samuel_unknown
25.03.2014

Введение

SFML имеет несколько ресурсных классов: для картинок, шрифтов, звуков и т.д. В большинстве программ эти ресурсы будут загружены из файлов, при помощи своих функций loadFromFile(). В некоторых других случаях, ресурсы будут упакованы в исполняемый файл или в большой файл данных, и тогда будут загружаться из памяти с помощью loadFromMemory(). Эти функции покрывают практически все возможные варианты использования — но не все.

Иногда вы хотите загрузить файлы их необычного места, такого как сжатый/зашифрованный архив или удалённая сеть, например. Для подобных специальных случаев SFML предоставляет третью функцию загрузки: loadFromStream(). Эта функция считывает данные из абстрактного класса sf::InputStream, который позволяет определить собственные реализации.

В этом уроке вы узнаете как написать и использовать свой собственный производный входной поток. (далее…)

Потоки

samuel_unknown
24.03.2014

Что такое поток?

Большинство из вас должно быть уже знают что такое потоки, но тем не менее, здесь приведено небольшое объяснение для тех, кто впервые сталкивается с этой концепцией.

Поток это последовательность инструкций, которая обрабатывается параллельно другим потокам (т.е. параллельно другим инструкциям). Каждая программа состоит как минимум из одного потока: главного потока, который запускает функцию main(). Программы, использующие только один поток, называются однопоточными, но если вы добавите в неё один или несколько потоков, то она уже будет многопоточной.

(далее…)

Обработка времени

samuel_unknown
20.03.2014

Время в SFML

В отличии от большинства других библиотек, в которых время представлено в виде числа миллисекунд (тип данных uint32) или числа секунд (float), SFML не навязывает какие-либо специфические единицы или типы для значений времени. Вместо этого библиотека оставляет этот выбор за пользователем через гибкий класс sf::Time. Все классы и функции библиотеки SFML, работающие со временем, используют этот класс.

sf::Time определяет временной интервал. Иными словами, не представляет какое-то конкретное значение даты и времени (год/месяц/день/час/минута/секунда), а просто показывает количество времени, и то как оно будет истолковываться, зависит уже от контекста.

(далее…)

So in this very quick tutorial, let’s learn about the basics of the mighty OpenGL-powered SFML Graphics Library.

What is SFML?

Simply put SFML is a multimedia library for C++ with bindings available for other languages such as Python, Rust, etc. It does not just let you use hardware-accelerated 2D Graphics with OpenGL but also has a variety of methods related to different types of media such as fonts, audio, etc. It stands for Simple and Fast Multimedia Library. Well, how simple is it? So simple that you could get a snake game running in less than 15 minutes. How fast is it? It’s so fast that you’d be running the application at several thousand frames per second.

Where is SFML used?

SFML is used heavily in making games and even game engines. And even though SFML doesn’t support 3D rendering yet it is used for context creation. Since OpenGL can’t create a window, 3D graphics programmers use SFML (at least most of the time) for the task.

Setting up Environment

Before we program in SFML we must set up the environment! Hopefully, it’s not a much of a headache especially not if you are in Linux! Debian Linux users (and any other flavour of Linux with apt/apt-get) can install SFML with the following command:-

sudo apt-get install libsfml-dev

Windows users can download SFML from this link and follow the guide to install it.

Getting started with SFML

Here’s the most basic SFML application you’ll ever find: 

CPP

#include <SFML/Graphics.hpp>

int main()

{

    sf::Window window(

        sf::VideoMode(640, 480),

        "Hello World");

    return 0;

}

Now to compile the program – since SFML is a dynamically linked library one needs to link the program to the library. This step depends on what component of SFML one is using. Since we are using Graphics.hpp we say:-

g++ main.cpp -lsfml-graphics -lsfml-window -lsfml-system

Assuming the source filename you used main.cpp! The step will be different if someone uses Visual Studio. You can refer here to see how to compile a SFML project with Visual Studio. Now once you run the program you may notice that the window is created but it vanishes automatically. This is because our driver function main creates a window and once it is created it moves to the second statement which is return 0; and hence exits the program! So what we need is a basic loop that will keep running as long as the user doesn’t close the window. So let’s refactor our code and this time understand line-by-line what is actually going on: 

CPP

#include <SFML/Graphics.hpp>

int main()

{

    sf::Window window(

        sf::VideoMode(640, 480),

        "Hello World");

    while (window.isOpen()) {

        sf::Event event;

        while (window.pollEvent(event))

            if (event.type ==

            sf::Event::Closed)

                window.close();

    }

    return 0;

}

Before running the program let’s understand what’s going on! Explanation

  1. The first statement creates a window object using the Window constructor. In this, we pass the videomode and title of the window. And by the way, VideoMode is simply a type that defines the dimensions of the window (and bits per pixel but we don’t need that now). And also note that we are using ‘sf’ namespace as all the SFML classes and Methods are defined under this class.
  2. In the second statement we have some new logic. We are basically running a loop as long as the window is open. Turns out the Window class provides a method isOpen which returns whether or not is a window open. Now inside of this loop we check for events. We create an event object which then we later pass in window.pollEvent. What pollEvent method basically does is it checks if  the event queue is not empty. It updates event with the next event in the queue and then in the event loop we check if the event was not sf::Event::Closed which is just a cryptic way of asking SFML did the user X..ed the window? By default nothing happens when the user hits the close button, so we override this behaviour by closing the window.

Note that closing the window doesn’t terminate the program! But since our window is now closed the isOpen method will now return false and we will return out of what’s called – the main loop of the program! Now if you run the program you get a weird looking window (as shown below). Sure you can close it but it looks weird, the previous contents of the screen are mapped to it and look super weird. This is happening because we are not clearing the window!! In the next example, we are going to do just that (clearing the window) and also draw shapes to the screen? Sounds fun! Let’s get started-

Rendering Simple Shapes with SFML

SFML is not all about window-creation (even though many people use it only for that). It can be used to render hardware-accelerated graphics (including some basic as well as complex shapes). In this example, we’ll constrain ourselves to draw a basic shape (a circle):- 

CPP

#include <SFML/Graphics.hpp>

int main()

{

    sf::RenderWindow window(

        sf::VideoMode(640, 480),

        "Hello World");

    sf::CircleShape shape(200);

    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;

}

This would produce the following output:- Explanation: 

  1. Note: RenderWindow has been used instead of Window. This is particularly because we are rendering something in the window. The Window class is actually meant for OpenGL programmers or anyone who simply wants to create and draw a window! If we have to render something on the window we have to use RenderWindow class. The fundamental difference between the two is just this that one is meant for simply creating a blank window for context-creation and other is specifically for 2D rendering which you can’t use outside of SFML.
  2. Moving on from RenderWindow, in line 06 we create a circle shape and pass in a radius of 100. Now exactly after the event loop we clear the contents of the window. This is important otherwise the circle is drawn in the previous frame (previous iteration) would still be there and if we have a moving circle it’d have the effect of creating a lot of circles! So we clear the screen to erase the stuff that was drawn in the previous frame and in the fresh new screen we draw our circle shape! Note that since we didn’t set the position of the circle it’d be defaulted to (0, 0). After drawing the shape we have to display the contents of the window. Why this is important is because the shape is first drawn not on the window but on a blank empty canvas, and while SFML is drawing on this empty canvas it shows the contents of the previous iteration. And when the process of drawing on the canvas is completed, it flips the windows contents with the newly created canvas. This entire process is called double buffering if you are curious.

Advantages of SFML

The advantages of SFML over other multimedia libraries are:-
 

  1. SFML is free and open-source (unlike DirectX which is closed source or Metal which is proprietary)
  2. SFML is cross-platform It can run in Windows, Linux/Unix, Mac and experiments are already going on to make it portable with Android and iOS (Compared to other graphic libraries such as Windows API, etc which only support a single platform)
  3. SFML is super-fast Your application will most of the time run at several thousand frames per second compared to some graphic APIs which fail to reach even 500fps!
  4. SFML is multi-language In this article we used C++ but you could have created the same thing using Python or even GoLang!! That is to say that SFML provides official bindings for several mainstream languages. Most Graphic APIs hardly provide more than one language-binding whereas SFML provides bindings for over a dozen of different programming languages!!

Disadvantages of SFML

There are also some disadvantages of SFML that come along the way:-

  1. SFML cannot do 3D! SFML is strictly written to provided low-level hardware-accelerated 2D graphics rendering. For 3D you’ll perhaps have to use it in combination with OpenGL
  2. No firm-support for Android and iOS! Even though experiments are going on yet currently there is no such firm support for Android, iOS or other mobile platforms

Further Reading

Now I’d end this article. I hope you learned a thing or to. Here are some books that you can read to learn more in SFML

  • SFML Blueprints
  • Mastering SFML Game Development

Of course the original sfml wiki is charm, you can refer there as well. Also the people at the forums are very helpful and will gladly help you if you have any doubt. I wish you good luck in your journey of learning SFML. You can also read more about the dynamic libraries (and in what aspect do they differ from their static counterparts) in this post

References

https://www.sfml-dev.org/tutorials/2.0/start-linux.php https://www.sfml-dev.org/tutorials/2.0/window-window.php https://www.sfml-dev.org/tutorials/2.0/graphics-shape.php

Last Updated :
20 Jun, 2022

Like Article

Save Article

Содержание

Введение
Скачивание библиотеки SFML2
Создание проекта в Visual Studio
C/C++ General — include
Linker General — lib
Linker Input
SFML2.dll
Другие статьи о С++

Введение

SFML (англ. Simple and Fast Multimedia Library — простая и быстрая мультимедийная
библиотека) — свободная кроссплатформенная мультимедийная библиотека.

Написана на

C++

, но доступна также для

C

,

C#, .Net

, D,

Java
,

Python

,

Ruby

,
OCaml,

Go

и Rust. Представляет собой объектно-ориентированный аналог

SDL
.

SFML содержит ряд модулей для простого программирования игр и мультимедиа приложений.
Исходный код библиотеки предоставляется под лицензией zlib/png license.

В настоящее время доступны следующие модули:

  • System — управление временем и потоками, он является обязательным, так как все модули зависят от него.
  • Window — управление окнами и взаимодействием с пользователем.
  • Graphics — делает простым отображение графических примитивов и изображений.
  • Audio — предоставляет интерфейс для управления звуком.
  • Network — для сетевых приложений.

Загрузка библиотеки

Скачать SFML2 можно на сайте

sfml-dev.org

Затем архив нужно распаковать, например, создав директорию

C:DevelopmentSFML2

Создание проекта

После этого в

Visual Studio

создайте пустой C++ проект. Консольное приложение для win32, например.
И в этом проекте создайте файл main.cpp

Обычно проекты храняться в директории

C:UsersUsernamesourcerepos

Например, мой проект с

тетрисом

лежит в

C:UsersAndreisourcereposTetrisSFML

В

Visual Studio

можно открыть расположение файлов проекта нажав на его называние правой
кнопкой мыши и выбрав

Open Folder in File Explorer

Затем нужно перейти в настройки проекта и подключить некоторые директории из
SFML2 к проекту.

C/C++ General

В

C/C++ General Additional Include Directories

Нужно добавить путь до директории include

C:DevelopmentSFML2include

Linker General

В

Linker General Additional Library Directories

Нужно добавить путь до директории lib

C:DevelopmentSFML2lib

Linker Input

В

Linker Input Additional Dependencies

Нужно добавить следующие библиотеки

sfml-audio-d.lib
sfml-graphics-d.lib
sfml-network-d.lib
sfml-system-d.lib
sfml-window-d.lib

Из директории

C:DevelopmentSFML2bin

Нужно скопировать следующие .dll в директорию проекта (чтобы лежали рядом с main.cpp)

  • sfml-graphics-d-2.dll
  • sfml-system-d-2.dll
  • sfml-system-d-2.dll

Рисуем круг

sfml-dev.org

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

Похожие статьи

Development на C++
Перегрузка функций
-c: Компиляция
Разбиение кода на части
Вектор
Указатели
Классы
Тетрис на C++ с библиотекой SFML2
SDL
Массив Структур
Как узнать тип переменной C++
Решение задач на C++
Как создать пустую строку в C++
Запросы к REST API на C++
Ошибки C++
Make

SFML (Simple Fast Multimedia Library) — это C++ библиотека для мультимедиа. В статье мы воспользуемся SFML для рисования фигур в окне.


Содержание

Создайте каталог с названием sfml.1. Откройте каталог в Visual Studio Code. Откройте терминал и убедитесь, что вы находитесь в этом каталоге:

Скриншот

Все упражнения и задания вы будете выполнять в подкаталогах каталога sfml.1: sfml.10, sfml.11 и так далее.

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

Простая программа со сборкой через 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;
}

Сейчас каталог должен выглядеть так:

Скриншот

Далее следуйте шагам:

  1. Откройте терминал и введите команду g++ 00/main.cpp -o 00.exe. Убедитесь, что компиляция прошла успешно, затем выполните команду 00.exe.
  2. Удалите программу командой del 00.exe
  3. Затем соберите программу с помощью CMake. Эта операция выполняется в два шага: конфигурирование + сборка.

Внимание: в обеих командах ниже есть точка “.”, она означает “использовать текущий каталог”

cmake -G "MinGW Makefiles" .
cmake --build .

Вывод первой команды будет примерно таким:

D:ProjectsCppDistroworkspace>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:ProjectsCppDistroworkspace>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

Если сборка была успешной, запустите 000.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:ProjectsCppDistroworkspace>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 .

Если сборка была успешной, запустите программу 011.exe. На 5 секунд появится окно, а затем оно исчезнет.

Скриншот

Окно показывается, пока выполняется инструкция sf::sleep(sf::seconds(5));, а затем программа заканчивается и окно скрывается. В будущем мы научимся показывать окно столько, сколько захотим, и закрывать по нажатию на кнопку в верхнем правом углу окна.

Давайте разберём, что выполняет код:

  1. Инструкция sf::RenderWindow window(sf::VideoMode({800, 600}), "title") объявляет переменную window, которая имеет тип “графическое окно”, размеры 800×600 px и незамысловатый заголовок “title”.
  2. Вызов метода window.clear() очищает окно, а вызов window.display() выводит на экран то, что было нарисовано после очистки.
    • подробнее о методах sf::RenderWindow вы узнаете в документации SFML (sfml-dev.org).
  3. Инструкция sf::CircleShape shape1(40) объявляет переменную shape1 — круг размером 40px.
  4. Вызовы shape1.setPosition и shape1.setFillColor задают позицию круга в пикселях и цвет в виде RGB-компонентов (Red, Green, Blue).
    • подробнее о методах CircleShape вы узнаете на странице документации (sfml-dev.org)

Теперь добавьте больше фигур:

Скриншот

Запустите CMake, а затем программу:

cmake --build .
011.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 и запустите 022.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 и запустите 033.exe. Результат будет таким:

Скриншот

Если всё в порядке, зафиксируйте код с помощью Git (добавьте файлы и сделайте commit).

Введите команду git log, проверьте, что commit сделан. Выйти из просмотра лога можно с помощью горячей клавиши Q.

Задание sfml1.3

Нарисуйте с помощью ConvexShape, RectangleShape и CircleShape домик такого вида:

Скриншот

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

Понравилась статья? Поделить с друзьями:
  • Превенар 13 инструкция по применению рлс
  • Крем эльвагин инструкция по применению цена отзывы аналоги
  • Крем эльвагин инструкция по применению цена отзывы аналоги
  • Инструкция по применению мыльно содового раствора
  • Руководство по ремонту вольво xc90