Найти тему
Сделай игру

Непростые проекты

Когда я только начинал данный проект - у меня отсутствовала цель напрягаться; так, хотелось легко и непринуждённо написать несколько игрушек и удовлетвориться этим.

Покуда всё было относительно просто (разминка, эмуляции, начальные вещи) - всё шло не то, чтобы очень гладко, но без пробуксовки. Проблемы начались, как водится, там, где их совсем не ждали.

Взять, например, обработчик столкновений. Казалось бы, что тут сложного? Выяснить факт пересечения двух прямоугольников - пустяк, ну а на этом, собственно, и строится 90% механик игры.

Но, как оказалось, всё не совсем так. Вернее совсем не так. Изначально, обработчик столкновений оказался не так прост, как предполагалось. И да, обработать столкновение 2 прямоугольников куда проще, чем столкновения N прямоугольников, потому, что при самом факте столкновения требуется принимать некоторое решение о том, что же делать дальше, а вот тут и проявляются все неоднозначности.

Дальше - больше. Наличие факте пересечения, как оказалось, лишь малая часть того, что надо обработать. Дело в том, что само столкновение двух объектов может произойти только в внутри некоторой системы. Значит надо иметь, как минимум, структуры сталкивающихся объектов и систему их хранения, поиска и оптимизации. Хранилище надо иметь возможность загружать данные, сортировать их по типу, предоставлять срезы по указанному критерию и много чего ещё.

А сами данные? Вот, скажем, описание уровня, логика поведения противников, не-игровые персонажи, скрипты и многое другое. Даже не заглядывая сильно вперёд - нетрудно догадаться, что всё это надо как-то описать, сохранить и иметь возможность загружать. И что самое интересное - практически неважно, что за игрушка создаётся - везде будет плюс-минус одно и то же (с поправкой на тип игры).

Понятно, что все эти и многие другие задачки уже давно решены при помощи разных движков, о которых я уже писал. Но ведь это не по-спортивному. Какой смысл просто сделать игру, если на сегодняшний день хороших, плохих и ужасных игр так много, что даже если они перестанут выпускаться - жизни не хватит, чтобы переиграть во все, что изданы? Интересно не просто сделать игру, а воспользоваться определёнными инструментами. Вот я и пользуюсь.

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

1. Элемент - игровой объект (всё, что есть видимого или невидимого на экране)
- имеет тип (для выбора способа действия)
- может иметь какие-то свои персональные данные, зависимые от типа
- имеет некоторые типы, с которыми взаимодействует
- обрабатывает столкновения и реагирует на них в соответствии с [дополнительными правилами]

2. Элемент хранится в хранилище элементов; для каждого типа - динамически создаётся своё хранилище
- можно добавить, удалить элементы
- можно найти элементы, находящиеся в какой-то зоне (прямоугольнике)
- можно быстро добавить/удалить все элементы (пакетное управление)
- некоторые типы маркируются для быстрого управления

3. Контроллеры - для управления
- игровым персонажем (зависит от потребностей)
- противником (может быть несколько вариантов для разных типов и условий реагирования)

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

5. Управляющий комнатами
- работает с исходниками всех комнат (для построения их), динамических объектов и игроков (видимо, читает из файла)
- отслеживает события и запускает те или иные скрипты
- отображает по необходимости меню (включая отрисовку)
- ... может что-то ещё

Просто картиночка для иллюстрации :-)
Просто картиночка для иллюстрации :-)