Как подключить sfml в visual studio 2019

Обновлено: 07.07.2024

Эта статья - первое,что вы должны изучить перед использованием SFML с помощью Visual Studio IDE (компилятор Visual C++). Здесь описывается,как настроить ваши проекты SFML.

Устанавливаем SFML

Во-первых,вы должны загрузить SFML SDK со страницы загрузки.

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

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

Создание и настройка проекта SFML ===

Первым делом необходимо выбрать какой тип проекта создать - вы должны выбрать "Win32 application".Мастер предложит несколько пунктов для настроек вашего проекта - выберите "Console application",если вам нужна консоль,или "Windows application",если она вам не требуется.Выберите "Empty project",если вам не требуется сгенерированный автоматически код.
Для целей этой статьи,вы должны создать main.cpp и добавить его в проект,теперь мы будем иметь доступ к настройкам C++(в ином случае Visual Studio не будет знать какой язык будет использоваться в этом проекте).Далее вы увидите,какой код мы напишем в этом файле.

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

В свойствах проекта добавьте:

Путь к заголовочным файлам SFML (<sfml-install-path>/include) в C/C++ » General » Additional Include Directories
Путь к библиотекам SFML (<sfml-install-path>/lib) в Linker » General » Additional Library Directories
Эти пути одинаковы в режиме Debug и Release,поэтому установите их глобально для вашего проекта("All configurations").

Следующим шагом будет линковка к вашему проекту необходимых вам библиотек SFML (файлов .lib).SFML состоит из 5 модулей (system, window, graphics, network and 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-файлы.Если вы хотите избавиться от этих DLL-файлов и иметь SFML напрямую встроенную в ваш .exe-файл,вы должны прилинковать статическую версию.Статические библиотеки SFML имеют "-s" суффикс - "sfml-xxx-s-d.lib" для Debug и "sfml-xxx-s.lib" для Release.Также вы должны определить макрос SFML_STATIC в опциях препроцессора вашего проекта.

Если вы не знаете разницы между динамической и статической библиотекой и не знаете какую использовать,вы можете найти о них подробную информацию в Google.

В этом уроке я хотел бы показать, как подключить библиотеку SFML к среде разработки Visual Studio.

SFML содержит ряд модулей для простого программирования игр и мультимедиа приложений.


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

Запускаем Visual Studio, файл->создать->проект->пустой проект. (Имя проекта, решений и путь выбирайте сами).


Добавляем исходный код – для этого слева в обозревателе решений находим вкладку «Файлы исходного кода»->правый клик->добавить->создать элемент->файл C++ (имя main.cpp)->добавить.

Далее вставляем вот этот тестовый код в файл main.cpp

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


Для того, чтобы всё это работало – необходимо подключить библиотеку SFML.

Для начала, все действия мы делаем для конфигурации Debug.

Заходим вверху «проект»->свойства “имя проекта”->свойства конфигурации->C++->общие

В пункте «дополнительные каталоги включаемых файлов прописываем путь до раннее распакованного архива с библиотекой (+ \include.)

Например: C:\Program Files\SFML-2.3.2\include


Затем идем в компоновщик->общие и в пункте «дополнительные каталоги библиотек» прописываем путь к папке lib;


Далее идем в компоновщике во вкладку ввод и в первой строке «дополнительные зависимости» вписываем перед всеми библиотеками следующую строчку:

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


Только что подключили основные необходимые для работы библиотеки.

Последний штрих – идем во вкладку C++->препроцессор и в первой строке «определение препроцессора» в самом начале дописываем: SFML_DYNAMIC;


Напоминаю, все действия мы делали для конфигурации Debug. Все тоже самое нужно проделать для конфигурации Release.
Заходим вверху «проект»->свойства “имя проекта”->свойства конфигурации. В левом верхнем углу находим Конфигурация, нажимаем на слайдер и выбираем Release.
И повторяем несколько предыдущих пунктов.






Запустим и словим ошибку. Зато соберется проект и появится папка debug.

Теперь идем в папку бинарников “bin”, которую вы скачали и распаковали с библиотекой (мой вариант D:\SFML-2.2\bin\) и копируем всё содержимое этой папки (dll файлы типа sfml-graphics-2.dll) в папку с вашим проектом в папку debug (после сборки появилась эта папка), но не в тот debug, где лежит файл с исходным кодом “main.cpp”, а тот, где появляется exe файл.

В эту же папку копируем и вот эти файлы :

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

Теперь проект можно запустить и если вы всё сделали правильно, то увидите зелёный круг как на скриншоте ниже:


Прежде чем приступить к весёлой части с кодом, придётся пройти муторную, но важную часть с настройкой sfml. Данный гайд написан для Visual Studio 2019 на Windows. Установка для VS 2017 практически идентична, но могут быть незначительные отличия. Для других платформ крайне рекомендуется поискать гайд по настройке именно для вашего окружения. Ошибки на этом этапе, в лучшем случае, не дадут проекту скомпилироваться, в худшем – скомпилируются неправильно и вынесут вам мозг.

Переходим на главный сайт библиотеки и скачиваем последнюю стабильную версию (2.5.1 к моменту написания статьи). Выбираем для С++ 15(2017) 32-бита. Установка 64-битной версии идентична, для экономии времени сосредоточимся на более универсальной.

Распаковываем архив в удобную директорию, можно сразу сохранить в буфер путь до содержимого папки, в моем случае – это C:\SFML-2.5.1\ .

Открываем VS-2019, создаем новое консольное приложение Windows, Называем проект FirstGameEngine, получаем консольный хеллоуворлд.

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


Выставляем конфигурацию Все конфигурации и платформу Win32 . Выбираем пункт С/С++ → Общие , находим Дополнительные каталоги включаемых файлов – здесь нужно указать путь до папки include . Вставляем путь из буфера и дописываем, как сделал я. Если сомневаетесь, нажмите изменить и найдите папку через эксплорер.


Спускаемся в Компоновщик → Дополнительные каталоги библиотек и проделываем тоже самое, но уже с папкой lib .


Переключаем Конфигурацию на Debug. Открываем Компоновщик → Ввод → Дополнительные зависимости . Копируем этот перечень sfml-graphics-d.lib;sfml-window-d.lib;sfml-system-d.lib;sfml-audio-d.lib; и аккуратно, не стирая и не перезаписывая уже имеющиеся записи, вставляем его в начало списка.


Переключаемся на Release и так же аккуратно вставляем sfml-graphics.lib;sfml-window.lib;sfml-system.lib;sfml-audio.lib;

Теперь поочередно запускаем Debug и Release, ловим по ошибке. Этот шаг необходим, чтобы студия создала папки проекта с exe-файлами. Сразу найдите эти каталоги. Их расположение зависит от настроек студии. Обычно они создаются на уровень выше папки с кодом. Теперь возвращаемся к распакованному архиву sfml, находим папку bin и копируем все бинарники с символом d в названии плюс openal32.bin в папку Debug, и то же самое без d + openal32.bin в Release.

Должна получиться такая картина:


Самая нудная часть позади.

Написание первого игрового движка на С++.

К файлу FirstGameEngine.cpp мы вернемся чуть позже. Его единственная задача – это запустить в функции main() наш движок.

Класс персонажа.

Bob – простой класс для представления фигурки персонажа, управляемой игроком. Код класса будет легко расширяться, а что самое главное – его несложно переписать под любой другой игровой объект, который вы захотите добавить. Для этого потребуется заменить текстуру и описать поведение нового объекта в методе update().

Создаем новый заголовочный файл. Кликаем Проект → Добавить новый элемент → Файл заголовка. Называем Bob.h и объявляем следующие поля и методы:

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


Сохраните это изображение в директорию FirstGameEngine/FirstGameEngine.

Bob.cpp

Приступим к реализации.

По той же схеме создаем файл Bob.cpp, только выбираем Файл С++ . Теперь добавляем в файл код:

В конструкторе мы установили значение переменной m_Speed на 400. Это значит, что Боб пересечет экран шириной в 1920 пикселей за 5 секунд. Также мы загрузили файл Bob.jpg в Texture и связали его с объектом Sprite. В переменных m_Position.x и m_Position.y установлено начальное положение Боба. Не забывайте, что в С++ координаты отсчитываются от верхнего левого угла и ось-у направлена вниз, не потеряйте Боба.

Функция update обрабатывает два If. Первое If проверяет, нажата ли правая кнопка (m_RightPressed), а второе следит за левой (m_LeftPressed). В каждом If скорость (m_Speed) умножается на elapsedTime. Переменная elapsedTime рассчитывается в функции Start движка (класс Engine). Им мы сейчас и займемся.

Engine.h

Создаем новый заголовочный файл Engine.h:

Класс библиотеки SFML, RenderWIndow, используется для рендера всего, что есть на экране. Переменные Sprite и Texture нужны для создания фона. Также в заголовке мы объявили экземпляр класса Bob.

Engine.cpp

Здесь мы реализуем конструктор и функцию start(). Создаем файл класса так же, как для Bob.cpp, и добавляем в него код:

Конструктор получает разрешение экрана и разворачивает игру на весь экран с помощью m_Window.create, загружается Texture и связывается с объектом Sprite.

В качестве фона вы можете использовать любое изображение, ниже я выложу своё. Рекомендую подобрать или масштабировать его по размерам вашего рабочего стола. Пункт не критичный, но смотрится приятнее, а в рамках данного курса мы не будем разбирать работу с окном и его размерами. Переименуйте файл в background.jpg и поместите в каталог FirstGameEngine/FirstGameEngine .

Можете воспользоваться моим примером:


Игровой цикл.

Обрабатываем пользовательский ввод

Функция input обрабатывает нажатия клавиш через константу Keyboard::isKeyPressed, предоставляемую SFML. При нажатии Escape m_Window будет закрыто. Для клавиш A и D вызывается соответствующая функция движения.

Обновляем игровые объекты

Теперь опишем функцию update. Её задача вызвать аналогичную функцию обновления состояния у всех игровых объектов. В нашем случае это только Bob.

Создаём файл Update.cpp и добавьте в него код:

Отрисовка экрана.

Это последняя функция класса Engine, её задача – отрисовать все объекты текущего экрана. Создайте файл Draw.cpp и добавьте в него код:

Экран каждый виток цикла очищается методом clear. Первым делом должен быть отрисован фон, чтобы потом поверх него можно было поместить Боба.

Запускаем движок!

Теперь вернемся к FirstGameEngine.cpp.

Наш игровой движок, как и положено первой работе, получился очень простым: он умеет только двигать главный объект и закрывать программу. Он не умеет обрабатывать столкновения, работать с интерфейсом и еще много чего. Возможно, этим мы займемся позже. Однако он отлично описывает то, как строится ядро игрового проекта с нуля. К тому же, в него довольно легко добавлять новые объекты и расширять функционал. Попробуйте, в качестве практики, добавить второго боба, управляемого клавишами J и L, у вас уже есть для этого все необходимые знания. Или поменяйте фон, если Боб выходит за границу экрана. Задачка уже посложней, но тоже вам по силам. =)

Эта инструкция есть то, что Вы должны прочитать, если собираетесь использовать SFML совместно со средой разработки Visual Studio (Visual C++ компилятор). It will explain how to configure your SFML projects.

Установка SFML

Сначала, скачайте SFML SDK с официального сайта.

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

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

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

В свойствах проекта добавьте:

  • The path to the SFML headers (<sfml-install-path>/include) to C/C++ » General » Additional Include Directories
  • The path to the SFML libraries (<sfml-install-path>/lib) to Linker » General » Additional Library Directories

Screenshot of the dialog box for setting up the search paths

Linker » Input » Additional Dependencies

(Компоновщик » Ввод » Дополнительные зависимости)

Screenshot of the dialog box for setting up the project

Screenshot of the dialog box for defining the SFML_STATIC macro

Зависимости для каждого модуля, добавьте суффикс -d если вы хотите прилинковать SFML для отладки.

You might have noticed from the table that SFML modules can also depend on one another, e.g. sfml-graphics-s.lib depends both on sfml-window-s.lib and sfml-system-s.lib. If you static link to an SFML library, make sure to link to the dependencies of the library in question, as well as the dependencies of the dependencies and so on. If anything along the dependency chain is missing, you willget linker errors.

Читайте также: