Недавно я закончил цикл статей про разработку обработчика столкновений (один, два, три, четыре, пять). Получилось довольно сухо, но есть и положительные моменты: всплыли некоторые неочевидные проблемы.
Проблема в том, что сам по себе обработчик не обладает сколько-нибудь значимой ценностью, так как без привязки к определённым действиям лишается смысла.
Короче говоря, по мере написания обработчика столкновений стало понятно, что он возможен лишь с некоторой обвязкой: тем, что и является игровым движком.
Минимальный набор игрового движка
Не секрет, что на сегодняшний день игровых движков сделано немало. Однако это не только код, который заставляет всё работать по заранее описанным правилам. Игровой движок - это ещё и среда, в которой можно делать игры. Unity, Unreal Engine дают не только потрясающие возможности, но и студию разработки и отладки.
У меня такой роскоши нет, да и какой-то движок у меня случайно получился, поэтому расскажу про него. Итак, основные компоненты:
- Загрузчик данных: перед началом любой игры её надо загрузить и настроить сопоставление данных (какой ресурс для чего нужен и за что отвечает);
- Обработка статичной карты;
- Обработка звука и звуковых эффектов;
- Обработка динамических объектов;
- Обработчик событий и специальных сцен (например, скрипты поведения на сцене);
- Настраиваемые модели поведения персонажей;
- Набор сценариев взаимодействия (определение столкновения и реакции) "единиц" игрового мира;
- Механизм отрисовки (я использовал canvas, но можно использовать webgl или что-то другое);
- Механизм управляемой послойной отрисовки экрана (например, чтобы создать параллакс-эффект);
- Библиотека наиболее часто используемых примитивов и способов работы с ними (гуманоидные персонажи с возможностью перемещаться, прыгать, стрелять и бить мечом, катающиеся платформы и ленты и многое другое);
- Студия создания карт и персонажей (у меня отсутствует).
Зачем вообще студия карт
В какой-то момент это может показаться непонятным, мол, и так всё можно реализовать. Совершенно верно! Вот простой пример, как безо всяких студий реализовать генератор карты.
Но есть и более специализированные инструменты. Например, этот.
Причина использовать специализированные инструменты весьма проста: иногда приходится решать задачи не программного, а вспомогательного толка. Например, сделать прототип уровня.
Попытка описать это всё в файле набором числовых индикаторов штука утомительная крайне. А вспомогательный инструмент даёт шанс выполнить прототипирование (или выдать готовый результат) относительно быстро и просто.
Что ещё нужно
Хм, тут вообще нет никаких границ. Например, у отдельных игровых платформ, есть редакторы персонажей: позволяют создать типизированные объекты игрового пространства и добавить спрайты анимации. Это удобно, но накладывает некоторое ограничение: либо используешь тот инструмент, что есть, либо глубоко погружаешься в документацию (если она, конечно, имеется) и выясняешь, как создать свою раскладку со своими особенностями для и воткнуть её в игровой движок. Обычно это не слишком сложно, но и не всегда тривиально.
Например, есть замечательная виртуальная игровая консоль PICO-8, которая поставляется сразу со средами разработки. Тут есть всё необходимое для того, чтобы создать маленькую игру и распространять её затем в виде PNG файла.
Кстати, если тема заинтересовала - можете посмотреть ещё тут.
Вместо заключения
Сама идея игрового движка не нова, многопланова и имеет ряд причин, когда следует создавать новый движок:
- Это дешевле, чем брать какой-то готовый по любым из причин;
- Существующие движки не способны удовлетворить заявленные потребности;
- Платформа, под которую создаётся движок, не обладает нужным инструментарием;
- Коммерческий проект с целью перепродажи;
- Просто интересно создать движок.
Игровой движок не обязан быть коробочным решением, а может являть собой всего лишь кодовую базу и поддерживаемые решения других поставщиков, обеспечивающие недостающую функциональность (обычно планирование карт, графику и звуковое сопровождение); вопросы условного ИИ и скриптования сюжетных поворотов.
Думаю, что в ближайшее время, переработаю написанный в рамках опыта код и сделаю что-то вроде небольшого игрового движка. Дело интересное!