[DevLog] Редактор карт для настольного Зомбицида, часть 2

Добавил графический интерфейс. Теперь это даже похоже на редактор.

ZombicideMapEditor — это редактор/генератор карт для настольной игры Zombicide. Это небольшой проект с открытым исходным кодом, с помощью которого я изучаю Unreal Engine 4.

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

На этом этапе я занимался графическим интерфейсом. Главное открытие для меня — это то, что в Unreal Engine 4 можно делать UI на C++. Я боялся, что так как редактор виджетов работает только с блюпринтами, то и логику придётся делать на блюпринтах. Оказалось, что тут так же, как и с акторами: можно написать базовый виджет-класс на C++, потом создать виджет-блюпринт и отнаследоваться от этого базового класса.

Получается лучшее от обоих способов: можно мышкой накидать элементы виджета в визуальном редакторе блюпринта, а логику писать в базовом классе на C++. Придётся, правда, сделать небольшой код на блюпринтах, чтобы передать ссылки на элементы виджета в базовый класс, но это не сложно.

После этого открытия я вздохнул с облегчением, так как на C++ мне гораздо проще работать, чем с блюпринтами. Я сделал виджет для панели доступных тайлов: просто серый блок на треть экрана с сеткой, чтобы все внутренние элементы выравнивались в три столбца. Также сделал отдельный виджет для тайла: спрайт и текстовый идентификатор. Этот виджет как раз видно на скринах выше.

В прошлом девлоге я писал, что в основе архитектуры у меня MVC: model-view-controller. Я старался придерживаться идеи разделения внутренней логики и логики отображения на экране. Я скептически относился и всё ещё отношусь к тому, что их можно успешно разделять, но пока более-менее получается.

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

На гифке в начале поста видно основной процесс: сначала я кликаю на тайл в списке доступных. ViewActor отмечает этот тайл как активный. Теперь если водить мышкой по рабочему полю, то этот тайл будет подставляться в клетки сетки. За всю эту логику всё ещё отвечает ViewActor.

Если теперь кликнуть на каком-то месте поля, то ViewActor передаст в ModelActor, что в такое-то место нужно установить такой-то тайл. Модель берёт этот тайл из пула доступных тайлов и добавляет его на карту. Перед этим ещё возвращает прошлый тайл из этой клетки обратно в пул. Модель обновилась и шлёт сообщение. ViewActor ловит это сообщение и перерисовывает обновившуюся карту и список доступных тайлов.

Довольно простая логика. Я бы сказал, классическая для таких систем. В играх MVC не применим практически никогда, так как там отображение и логика очень сильно связаны друг с другом.

В прошлом посте я писал, что хочу сделать Drag’n'Drop. С ним оказалось сложно, поэтому я пока забил. Идея была в том, что можно зажать мышь на тайле в списке справа и просто перетащить его на поле слева. Но проблема в том, что поле — это акторы в мировом пространстве, а список справа — это UI, т.е. он рисуется поверх мирового пространства. Так что для перетаскивания нужно как-то делать так, чтобы оно выглядело, как перетаскивание из оверлея в мировое пространство. Решаемо, но я решил не тратить на это время, пока основная логика не готова.

Что дальше

Основной интерфейс уже начинает вырисовываться. Я его ещё немного пошлифую и, наверное, приступлю к генератору карт. Пора уже делать алгоритм коллапса волновой функции. А потом как получится.

Исходный код можно найти здесь:

1414
1 комментарий

Комментарий недоступен

2