В данной статье хочу кратко рассказать о разработке казуальной игры «Fata Morgana» глазами очевидца-программиста. К сожалению, сам проект так и не увидел свет в силу маленького бюджета и больших проблем с издателем. Поэтому, данную статью стоит воспринимать именно как непостмортем.
КРАТКО ОБ ИГРЕ
«Fata Morgana» планировалась как казуальная игра в жанре HOPA (Hidden Objects Puzzle Adventure) или же Поиск Предметов / Квест. Отличительной особенностью проекта был нетипичный для HOPA сеттинг: славянская мифология с элементами постсоветской современности.
ABOUT ME
На проект изначально я попал в качестве композитора, но в процессе трое Unity-разработчиков покинули команду, поэтому я под шумок переквалифицировался в единственного программиста в составе коммуны с плодово-ягодным названием "Клюква". Разработка шла на удалёнке и длилась около года в неспешном темпе.
РАЗРАБОТКА
Общалась команда в основном в Telegram, созвоны проводились в "благословенном Яндекс.Телемост" (С). Таски велись в Asana, который терпеть не могу по сей день. Таски были выстроены таким образом, что фиксировалось только три состояния: Готово, В процессе, Просрочено (прим. просрочено быстро превратилось в просрачено, и в таком виде и существовало до кончины проекта). Но для проекта такого размера и с одним программистом - вполне рабочий вариант.
Код хранился в локальном Git-репозитории и на GitHub.
Игра планировалась мультиязычной, поддерживающей как минимум русский и английский языки. Текст задавался в xml-льках, поэтому можно было отделаться единственным билдом с заменяемыми xml.
Также была необходимость отправлять исходники на тест команде. Т.к. я ленивый, то просто паковал итоговый .exe и data в zip-архив, превентивно отделив зерна от плевел.
ПРОГРАММИРОВАНИЕ
Игра должна была держать минимум две платформы: Windows и Android, а также уметь отображать множество красивых партиклов, скелетных анимаций и прочих красивостей.
В качестве IDE использовалась любимая и ещё актуальная на тот момент Visual Studio 2019 с поддержкой C++17 и C# с WinForms. На C++ разрабатывалась сама игра, на C# - различные тулзы: редактор сцен, редактор скриптов, блокнот для удобной локализации xml и мелочи по типу упаковщиков BitMap шрифтов.

(тулза для диалогов)

(тулза для диалогов)
Тулзы делались по остаточному принципу и могли бы быть и получше, но, как говориться - чем богаты.
Уровни хранились в xml. Удобно, с учётом того, что редактор на C#, а игра на плюсах.
Активно использовал STL и активно не использовал Boost, в силу его монструозного масштаба.
Все, что можно было вынести во внешние файлы - нещадно выносилось: конфиги, скрипты, параметры партиклов, и проч, и проч. Поэтому, скоро папка data стала изобиловать множеством подпапок с xml, ini и cfg. Игровые данные (графика, звук, текст) паковались в бинарные .dat файлы с xor смещением на собственное имя.
БИБЛИОТЕКИ
В игре использовались:
• SDL2 - знаем, любим и используем (zlib)
• pugixml - пожалуй, один из лучших парсеров xml (mit)
• переписанная под себя система партиклов от HGE (zlib)
• stb_image - хэдер-онли библиотека для загрузки изображений (mit)
• SDL_mixer для воспроизведения звука и музыки в игре (zlib)
Теперь подробнее про каждую из либ:
SDL2
Библиотека была выбрана по нескольким причинам. Во-первых, она устраивала заказчика, который имел опыт с ней. Во-вторых, я сам знал "как её готовить" (С)
Библиотека предоставляет множество удобств для кроссплатформенной разработки. Не буду здесь много расписывать, при желании можно почитать на их сайте. Для меня самым главным плюсом была абстракция от нативщины Android. Если Win32API и DirectX это наше всё, то с разработкой под Андрюшу я до сих пор на "вы".
Из возможных альтернатив - сейчас вышла новая версия библиотеки - SDL3, которая стала ещё удобнее и стабильнее, поддерживает нативный рендер (до этого использовался строго OpenGL) и на которой я сейчас пишу другой казуальный проект.
PUGIXML
Тут всё просто: самый быстрый, легкий и маленький парсер для xml. Прост в использовании, пригодится в любом проекте, рекомендую.
СИСТЕМА ПАРТИКЛОВ от HGE
Здесь уже пришлось повозиться, чтобы данный артефакт завелся под SDL. Ничего особенно примечательного в ней нет, из интересного - также вынес настройки частиц в самописные .par файлы, вдохновленные Невософтом:
parfrequency=20
effecttime=0;
blendtype=0
numparticle=17
simetria=0
polar=(0,0,0,0)
polardev=(0,0,0,0)
lissx=(0,0,0)
lissy=(0,0,0)
// ѕараметры частицы
gravity=400
gravitydev=0
partime=1000
partimedev=0
positiondev=(0,0,0)
speed=(0,60,0)
speeddev=(20,20,0)
color0=(1,1,1,1)
color0dev=(0,0,0,0)
color1=(0,0,0,0)
color1dev=(0,0,0,0)
radius0=15
radius0dev=0
radius1=10
radius1dev=0
rot=0
rotdev=0
drot=0
drotdev=360
polarpar=(0,30,0,0)
polarpardev=(0,0,360,0)
lissparx=(0,0,0)
lisspary=(0,0,0)
simetriapar=0
Грубо говоря, ini без секций.
Из альтернатив есть Astralax MagicParticles, но либа дорогая и есть вопросы к оптимизации. Также видел dazzle от форумчанина геймдева Irov.. (Юра, привет!), но тестить не приходилось, может быть и зря.
STB_IMAGE
Изначально хотели использовать майкрософтовский формат DDS BC7, но с появлением требования кроссплатформенности перешли на .png и .jpg
Хэдер-онли библиотека, любимая многими игроделами. Быстрая, лёгкая, маленькая и простая. В процессе использования напоролся на пару мелких багов, но сейчас их уже пофиксили.
Из альтернатив могу предложить SDL_image, практически, равносильная (при условии использования SDL).
SDL_MIXER
В игре предполагалось 5 каналов: музыка, звук, окружение, голос, мастер.
Не скажу, что библиотека оказалась лучшим выбором, реализовывать всякие эффекты и миксы было не очень легко и очевидно, но на тот момент, с учетом ограниченности времени, лучше бы мы все равно ничего не нашли.
ЗАКЛЮЧЕНИЕ?
Очень жаль, что проект так и не вышел в релиз, было потрачено много времени и усилий на его создание. Главной причиной закрытия стали известные вам события начала 20х годов, в следствие которых издатель BigFishGames отказался от сотрудничества с русскими разработчиками. Спонсировать дальнейшую разработку игры стало просто невыгодно.
Надеюсь, статья была вам интересна и, возможно, поможет определиться с выбором стека для подобного казуального проекта.
С уважением, искренне ваш, Женёк :)
Всем добра!