Кубы и стихии

Однажды дочь меня спросила: "Папа, когда мы с тобой сделаем игру?" Вопрос застал врасплох. Я стал программистом, чтобы создать игру мечты, но за 18 лет разработки мог похвастаться только top-down шутером, написанным ещё в школе на адовой смеси C, Asm, C++ и (внезапно) паскаля для рендеринга летящего звёздного неба, это когда ещё параллаксы не были мейнстримом. Правда, играли в этот шутер всем классом. В общем, я сел изучать современные фреймворки, обладая огромным багажом сетевой разработки на функциональных языках и почти нулевым - в геймдеве.

Gamesalad и Construct2 были слишком простым, мне нужно было что-то более гибкое, Unity и UE показались слишком тяжелыми для простой домашней игры. Выбрана была золотая середина - Game Maker Studio2. А тем временем в telegram-рассылке появилась новость про хакатон.

С takvur'ом мы познакомились в 2010 году в одной mmorpg. Игру купила известная компания, а наша дружба осталась. Takvur отлично рисует, и мы давно хотели вместе замутить эдакое, поэтому он сразу согласился поучаствовать.

Субботним утром появилось задание, и оно поставило нас в тупик, ведь в подавляющем большинстве игр прохождение достаточно вариабельное. Разница может быть в стратегии игрока, скиллах противников, но это было не то. В голове крутились образы аминокислот, перестраивающихся в цепочки ДНК, алхимические элементы сгорали в пламени стихий и возрождались в новых соединениях; всё это никак не хотело складываться в единую систему. И тут я вспомнил фильм Куб, где комнаты с ловушками меняли своё положение. Возникла идея сделать подземелье с загадками, комнаты в котором перестраиваются по скрытым для игрока правилам. Takvur предложил добавить стихии и расширить поле зрения на одну комнату в каждую сторону. Времени на разработку системы перемещения комнат не было, и мы решили заменить её на случайную генерацию.

Сборка в первый день
Сборка в первый день

В 12 мы начали. Пока takvur ещё был на работе и консультировал по механике удаленно, я решил начать с самого сложного - генерации комнат и перемещения между ними. Сделать матрицу комнат, отображать только подмножество элементов в центре матрицы - казалось, что может быть проще. Но довольно большой массив комнат, существующий за границами видимости, был плохой идеей, поэтому я решил генерировать и рисовать только те объекты, которые станут видны игроку в момент перехода. Чтобы хранить состояние отрисован/не отрисован для объектов, нужны были привычные кортежи, но их не было в языке, пришлось добавить ещё одну матрицу. К середине дня я понял все недостатки gml: адово не хватало матричного исчисления (да, потом я узнал про GMatrix), юнит-тестов и нормального хранилища для состояний,. Через десять часов работы настал переломный момент: я был уверен, что закончить в срок не получится, будет много багов и нафига оно, вообще, надо, но, несмотря на эти мысли, заставил себя продолжить - открылось второе дыхание на этой стометровке.

Сборка к утру второго дня
Сборка к утру второго дня

К 7 утра второго дня у меня были почти все спрайты с анимацией, а takvur отсыпался после такого титанического труда. Механика казалась готова и, казалось, достаточно добавить боёвку и анимаций, но не тут-то было. Обнаружилось два бага, с которыми нельзя было выходить в продакшн: во-первых, рисунок новых комнат не соответствовал их аффектам, комнаты, которые не должны были замедлять -- замедляли и так далее. Во-вторых возникало мощное провисание по памяти и производительности после пяти-шести переходов. И если первое решалось синхронизацией матриц, которых уже к тому времени было три. То второе произошло из-за отсутствия вменяемого сборщика мусора, и вся куча сгенеренных объектов перемещалась за границами пользовательского вью. Да, скажите вы, достаточно просто сделать удаление объекта, когда его координаты уезжают за границы камеры. Это было бы просто при наличии хоть какого-то механизма наследования свойств :) Но всё оказалось решаемым в конечном итоге.

Уже играбельная сборка
Уже играбельная сборка

Сама игра была готова в играбельном виде к вечеру воскресенья. Нам пришлось отказаться от загадок и ловушек, и вместо этого добавили взаимодействие со стихией, присущей персонажу. Если он находится в комнате с одноименной стихией, то лечится и получает бонус скорости, с противоположной -- теряет hp и замедляется. То же самое с монстрами, повреждения усиливаются для монстров своей стихии и режутся -- для противоположной.

Есть желание развиваться дальше: подключить контроллеры, расширить помещения, добавить ловушки и загадки, наконец-таки сделать сами комнаты реально перемещаемыми. Для этого хотелось бы получить обратную связь; понять, есть ли у игры перспективы.

А теперь титры. Спасибо takvur'у, за его авторский пиксель-арт и ночной труд, без него ничего бы не вышло.

Спасибо моей жене, которая с пониманием отнеслась к тому, что муж просто вывалился из реальности на 30 часов.

Спасибо дочке Алисе, которая напомнила мне о давних мечтах

UPD: вот балда, забыл сборку приложить --->

1313
2 комментария

Годная аркадка.
Единственное, что мне не понравилось - резкие переходы, при входе в дверь. Я вижу тут два варианта решения: Ставить врагов и персонажа "на паузу" во время перехода или сделать переход предсказуемым и плавным. А то ты переходишь возле врага, и он может наносить урон, а ты мышкой не успеваешь за "камерой" и не попадаешь по врагу.

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

2
Ответить

спасибо за братную связь, тоже думаю, это узкое место. в первую очередь просто будем останавливать время

Ответить