Сделал простенький Dungeon Crawler с монохромной графикой

На itch.io неделю проходил джем #dcjam2025, посвящённый данжен кроулерам от первого лица. Организаторы делают акцент, что игры должны быть полноценные, а не "наброски" или прототипы. Результатом моего участия стала игра под названием Drawngeon: Tutoretta's Easy Quest. Вы можете пройти её в браузере! Небольшая игра, прохождение может занять меньше 15 минут!

Сделал простенький Dungeon Crawler с монохромной графикой
Сделал простенький Dungeon Crawler с монохромной графикой

В джеме предполагалось создание полноценной игры, что я и старался сделать -- её можно пройти. Но всё же на самом деле это является прототипом моей будущей большой игры после Drawngeon. А если конкретнее, то Tutoretta's Quest станет основой для Drawngeon2!

Особенностью D2 вновь станет нарисованная от руки графика. Совсем немного можно её протестировать и в текущей веб-сборке нажав на F2 (видны изменения только у моряков и в локации с крысами). А вот так выглядит тестирование нового пайплайна по графике:

Сделал простенький Dungeon Crawler с монохромной графикой

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

Или как думаете, все современные и модные пацаны и пацанессы перешли уже в Телеграм?

Можно поиграть:

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

Как делал интерфейс

Задача: получить визуальный инструмент для создания пользовательского интерфейса (в своих старых проектах я жестко кодировал положение элементов пользовательского интерфейса).

Конечно, я уже использовал что-то вроде «кнопок», которым можно задать функцию, но речь шла о других элементах.

Путь решения:

Сначала я создал простой объект с «системным» спрайтом и назвал его o_ui_dummy. Я вспомнил, что инстансам можно давать осмысленные имена, не такие как inst_A1B2C3, а, например, inst_UI_HealthBar.

В пределах одной комнаты все было в порядке, интерфейс работал как надо — мне нужны были только координаты и размеры объекта + середина (для чего я сделал простую пару функций):

get_center_x = function () { return (bbox_right + bbox_left)/2; } get_center_y = function () { return (bbox_top + bbox_bottom)/2; }

Я сделал отдельную комнату для интерфейса, где «разогрел» сам интерфейс, то есть создал все объекты, расположил их визуально. От меню до игрового процесса проходил через эту комнату.

Теперь пришло время перемещаться между уровнями-комнатами, и достаточно простым решением было просто указать флаг o_ui_dummy «persistent».

Это отлично сработало.

Вот так объекты расставил
Вот так объекты расставил

Затем я добавил экран завершения игры, паузу, возврат в меню и начало новой игры. И ТУТ У МЕНЯ ВОЗНИКЛА ПРОБЛЕМА! По какой-то причине имена экземпляров (inst_UI_HealthBar, например) не находили объекты, хотя они точно были. Честно говоря, я ожидал такого исхода и уже думал, как быть дальше.

Текущая версия решения:

Было решено сделать все на глобальных переменных и структурах (добавлено изображение кода). Чтобы при первом посещении комнаты с интерфейсом запоминать все необходимые параметры, а потом искать данные по одноименным инстансам.

Сделал простенький Dungeon Crawler с монохромной графикой

Немного модифицировав старый код, я заменил inst_UI_HEALTH на get_ui(inst_UI_HEALTH) и решил проблему.

Сделал простенький Dungeon Crawler с монохромной графикой

Я понимаю, что это далеко не лучшая реализация интерфейса. Кроме того, вы можете сказать, что нет необходимости делать o_ui_dummy, и проще сделать отдельный объект для каждого элемента, учитывая, что они рисуются уникально.

Напомню, что можно поиграть или скачать под windows:

Спасибо за внимание! Что скажете о игре? Что скажете о методе таких интерфейсов?

56
19
3
22 комментария