Рисование простых линий в Defold-е (статья в стиле ДЮ) и разумеется реклама игры

Вот такие следы от снарядов в результате получены
Вот такие следы от снарядов в результате получены

Я вас категорически приветствую (позаимствуем пару фраз у ДЮ). Чем бы еще поднять привлекательность статьи - а точно - было дело я же работал в Mytona-е, и периодически видел ролики The Day Before.

А эта статья на самом деле реклама моей игры, надо бы не забыть указать ссылку.

Итак в процессе разработки столкнулся с одной сложностью, которую не ожидал. Это рисование простой геометрии в движке Defold, а именно рисование линий. Казалось бы ведь наверняка можно было сделать функцию типа

DrawLine(pos1, pos2, color)

Но такой функции нет. Хотя в дебаг режиме можно отрисовать линию

msg.post("@render:", "draw_line", { start_point = start_p, end_point = end_p, color = color_red })

тут посылаем сигнал рендеру отрисовать линию, но она будет видна только в дебаг режиме.

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

Рисование простых линий в Defold-е (статья в стиле ДЮ) и разумеется реклама игры

Но кто-то может возразить, для этих вещей можно использовать систему частиц, которая в Defold-е присутствует. Разумеется я ее пытался применить, но результат меня не устроил

Оставлять осколки без следов не хотелось, поэтому пришлось рисовать линию. В просторах интернета быстро нашлось соответствующее расширение Defold-а для отрисовки геометрии.

Итак приступаем к разбору модуля. Для начала создаем текстуру и на ней рисуем линии. Вроде просто. Итак начинаем - создаем текстуру,

local width = 512 local height = 1024 local channels = 4 self.resource_path = go.get("#sprite", "texture0") self.buffer_info = { buffer = buffer.create(width * height, {{name = hash("rgba"), type = buffer.VALUE_TYPE_UINT8, count = channels}}), width = width, height = height, channels = channels, premultiply_alpha = true }

далее берем каждую частицу и в функции update(dt) отрисовываем линию - примерно так

drawpixels.fill(self.buffer_info, 0, 0, 0, 0) (тут очистка текстуры от предыдущей отрисовки) drawpixels.line(self.buffer_info, x1, y1, x2, y2, 255, 255, 0, 1, true, 1)

и отрисовывается только один след, так как drawpixels.fill очищает всю текстуру и следы от предыдущих частиц, в результате видим мы только последний трейс. Создавать по текстуре для каждой частицы накладно. Надо сделать по другому: собрать все линии в один массив и на каждой итерации отрисовывать. Но Defold не объектно- ориентированный, а компонентный, тут все на сигналах. Когда мы создаем объект, у нас есть только id объекта. Мы не можем вызвать его функцию типа GetTracePositions() из вне. Соответственно, где то в модуле выше заводим данный массив и в функции update(dt) частиц заполняем его. И вот когда собрали все координаты линий у всех частиц можно и отрисовать. Результат:

Вот с этим уже можно релизится.

Из сложностей - Пришлось повозиться с размером и скейлом текстуры, и при заполнении массива линий заполняем так - допустим след из 5 линий. Значит надо 6 точек. Заводим на каждую частицу массив из 6 элементов и на каждом update(dt) сначала полностью заполняем, а затем новую добавляем, а последнюю удаляем. И каждый массив складываем в финальный. В результате получается массив массивов. И при отрисовке самую дальнюю линию рисую с альфой 0.5 (полупрозрачной) и далее альфу увеличиваю. В результате получается постепенно исчезающий трейс.

Сама игра из себя представляет арканоид, но не простой а с физикой: объекты не зафиксированы, а как бы парят в невесомости. Некоторые из них сбрасывают бомбы и оружие. Есть объекты боссы - при попадании в них создаются новые.

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

Рисование простых линий в Defold-е (статья в стиле ДЮ) и разумеется реклама игры

Например на рисунке выше можно разрушить скелетик и разбить пол литра пенного вдребезги, и я уже вижу твою реакцию.

Рисование простых линий в Defold-е (статья в стиле ДЮ) и разумеется реклама игры

и видос геймплея

ссылка на игру

Собственно вот и все, я пошел дублировать статью на пикабу.

А на сегодня все, до новых встреч.

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