Для начала вам нужно войти на сайт/зарегистрироваться.×

Поучаствовал в джеме на itch

На Itch.io совсем недавно завершился конкурс ДАНЖЕН КРОУЛЕРОВ!

r/gamemaker - Made a 3d dungeon crawler with 2bit pixel art graphics (planed to make it paper-like) for #dcjam2025 in about a week. Small game, you can play!

И я решил поучаствовать в нём. В результате получилось что-то, что я называл Tutoretta’s Easy Quest.

Dungeon Crawler Jam 2025 от DungeonCrawlers.org #dcjam2025

В данный момент идёт голосование. А вы можете поиграть в игру в браузере! Или скачать на Windows.

Если вы запустите игру и увидите в названии слово Drawngeon, то наверно будете недоумевать «а почему?». А всё потому что это часть прототипа Бумажного2!

r/gamemaker - Made a 3d dungeon crawler with 2bit pixel art graphics (planed to make it paper-like) for #dcjam2025 in about a week. Small game, you can play!
Тестовая бумажная графика. В Веб-сборке такого нет, только у меня на ПК. Однако, вы можете нажать F2 и некоторые текстуры изменятся.

Я хотел бы ещё рассказать вам о интерфейсе, который я использовал для этого проекта. Это было незадолго до появления 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».

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

r/gamemaker - Made a 3d dungeon crawler with 2bit pixel art graphics (planed to make it paper-like) for #dcjam2025 in about a week. Small game, you can play!

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

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

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

r/gamemaker - Made a 3d dungeon crawler with 2bit pixel art graphics (planed to make it paper-like) for #dcjam2025 in about a week. Small game, you can play!

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

r/gamemaker - Made a 3d dungeon crawler with 2bit pixel art graphics (planed to make it paper-like) for #dcjam2025 in about a week. Small game, you can play!

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


Что скажете о игре? Что скажете о методе таких интерфейсов?