Найти в Дзене

Менеджер ресурсов и динамический текст на SFML

Когда Вы только начинаете изучать игровую разработку на C++ с использованием SFML, перед многими из Вас встаёт вопрос: как правильно организовать хранение и загрузку игровых ресурсов? Сначала всё кажется просто - загружаешь текстуру здесь, шрифт там, звук где-то ещё. Но когда Ваш проект начинает расти, Вы сталкиваетесь с реальными проблемами. Одна и та же текстурная карта может загружаться в память трижды - для главного меню, для уровня и для редактора. В этом случае память расходуется неэффективно, а код превращается в спагетти из вызовов loadFromFile, разбросанных по всей кодовой базе. Тогда Вы начинаете понимать, что нужен системный подход. Какие варианты есть, это: хранение ресурсов в отдельных классах, глобальные переменные (да, я знаю, что это плохо), система с ручным управлением жизненного цикла. Каждый из этих подходов имеет свои недостатки. Либо ресурсы живут слишком долго, либо их освобождение происходит не в тот момент, либо доступ к ним неудобный. Самый оптимальный вариант
Оглавление

Когда Вы только начинаете изучать игровую разработку на C++ с использованием SFML, перед многими из Вас встаёт вопрос: как правильно организовать хранение и загрузку игровых ресурсов? Сначала всё кажется просто - загружаешь текстуру здесь, шрифт там, звук где-то ещё. Но когда Ваш проект начинает расти, Вы сталкиваетесь с реальными проблемами.

Одна и та же текстурная карта может загружаться в память трижды - для главного меню, для уровня и для редактора. В этом случае память расходуется неэффективно, а код превращается в спагетти из вызовов loadFromFile, разбросанных по всей кодовой базе. Тогда Вы начинаете понимать, что нужен системный подход.

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

Каждый из этих подходов имеет свои недостатки. Либо ресурсы живут слишком долго, либо их освобождение происходит не в тот момент, либо доступ к ним неудобный.

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

Но почему бы не упаковать все ресурсы прямо в исполняемый файл?

Мы создадим менеджер ресурсов, который использует встроенные возможности Windows.

Стоит сразу оговориться — это решение работает исключительно под Windows. Оно использует системные API-функции для доступа к ресурсам, встроенным в EXE-файл.

Главное преимущество этой системы — все ресурсы действительно хранятся внутри EXE-файла. Вы не представляете, как приятно, когда твоя игра представляет собой всего один файл, который можно скопировать куда угодно, и он просто работает. Никаких "где-то потерялась текстура", "не найден шрифт" и прочих проблем с путями.

Конечно, у этого подхода есть свои ограничения:

1. Размер EXE-файла увеличивается (но современные компьютеры с этим легко справляются)

2. Невозможно изменить ресурсы без перекомпиляции

3. Работает только под Windows

Но для многих сценариев разработки игр эти ограничения не критичны. В моём случае плюсы перевешивают:

1. Простота распространения (один файл!)

2. Защита ресурсов от случайного изменения

3. Гарантия, что все нужные файлы на месте

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

Структура проекта в Visual Studio 2022

📁 Проект/

├── 📄 main.cpp # Главный файл с основным циклом

├── 📄 ResourceManager.h # Заголовочный файл менеджера ресурсов

├── 📄 ResourceManager.cpp # Реализация менеджера ресурсов

├── 📄 ColorfulText.h # Заголовочный файл анимированного текста

├── 📄 ColorfulText.cpp # Реализация анимированного текста

├── 📄 resource.h # Идентификаторы ресурсов

└── 📄 resources.rc # Скрипт компиляции ресурсов

Файлы ресурсов

-2

Ожидаемый результат от программы

-3

Начинаем творить чудеса

Сначала создаём в ручную файлы ресурсов используя редактор кода С++ нашей IDE. Надеюсь Вы уже справились с установкой библиотеки SFML, если нет почитайте статьи выше.

resource.h

-4

resource.rc

-5

В нашей программе все ресурсы находятся в отдельной папке assets, которая в свою очередь находится в корневом каталоге проекта.

Теперь создадим класс управления ресурсами.

ResourceManager.h

-6
-7
-8

ResourceManager.cpp

-9
-10
-11
-12
-13
-14
-15

Теперь мы можем создать класс для создания феерического текста

ColorfulText.h

-16
-17
-18

ColorfulText.cpp

-19
-20
-21
-22
-23

А теперь все объединим в исполняем файле.

Мигающие_буквы.cpp

-24
-25
-26

Надеюсь у Вас всё получилось и до новых встреч !!!

В нашем телеграмм канале Вы найдете много примеров кода, которые удобно скопировать себе в проект.

Телеграмм канал - Программирование игр С++